This is an old revision of the document!


Laborator 03 - Editare

Descriere

  • nano
  • basic vim usage: deschidere fișier, modificare fișier, salvare, ieșire din editor
  • advanced vim usage: cut/copy/paste, dw, d3t, etc, identare de cod
  • expert vim usage: tab-uri, registre

Referințe din urmă:

  • fisiere și directoare în Linux (lab 02)
  • cp, rm (lab 02)
  • man (lab 02)

Materiale ajutătoare

Tutorial

1. Editoare clasice

Sistemele de operare Linux vin cu cel puțin un editor clasic. De exemplu, puteți folosi gedit (kate pe KDE) pentru un editor în mediul grafic.

gedit

După cum vedeți, editorul nu are prea multe facilități: permite introducere și modificare de text și salvarea conținutului.

Veți fi puși în situații în care nu veți avea access la un mediu grafic. În acest caz, dacă vreți un editor clasic puteți folosi nano.

nano

Și acest editor permite foarte puține lucruri. Ieșiți din el cu ^X (caracterul ^ semnifică tasta Ctrl)

2. Editorul vim. Intro

Pentru a fi mai eficienți, trebuie să folosim un editor puternic, cu multe opțiuni. Vim este unul din ele.

Vim se deosebește de editoarele clasice prin faptul că este un editor modal. Fiecare tastă are o semnificație diferită, în funcție de starea editorului.

Imaginea următoare sugerează, pe scurt, ce face fiecare mod:

  • modul Normal este modul inițial. Aici se poate naviga prin fișier
  • modul Insert este modul în care se poate insera text
  • modul Command permite introducerea de comenzi pentru Vim
  • modul Replace permite înlocuirea unor fragmente de text
  • modul Visual permite selecția unui fragment de text

Pentru a reveni în modul Normal se folosește tasta ESC. Pentru a trece din modul Normal în celelalte se folosesc diverse combinații de taste, după cum vom vedea în laborator

Deși pare complicat, vim nu este dificil de folosit. Nu trebuie să rețineți toate comenzile posibile de la prima folosire. Se învață în momentul în care vă loviți de ele și căutați să găsiți o soluție eficientă.

Deschideți fișierul steve jobs utilizând vim folosind una din comenzile următoare:

vim "steve jobs"
vim steve\ jobs
vim ste<TAB>

Sunteți în modul Normal. Puteți naviga prin fișier folosind tastele h,j,k,l exact ca în figura următoare.

Ca să rețineți ușor tastele folosiți mnemonici:

  • j are un marker în partea de jos
  • l e cea mai din dreapta tastă
  • h e cea mai din stânga
  • k e între ele

Rândul din mijloc al tastaturii poartă numele de home row. Dacă aveți degetele deasupra lui veți face cele mai scurte mișcări pentru a ajunge la orice tastă.

Folosiți tastele de navigare pentru a ajunge pe cuvântul Reed (linia 8, coloana 18).

4. Editare

Vrem să inserăm un cuvânt nou după cuvântul pe care ne aflăm. Pentru a intra în modul Insert se folosește tasta i.

Observați cum partea de jos a ecranului se modifică pentru a vă anunța că sunteți în modul Insert.

Inserați cuvântul College după cuvântul Reed (pe care v-ați oprit la exercițiul anterior)

Intrăm în modul Insert cu i.

5. Părăsire editor

Am terminat de editat fișierul și acum vrem să părăsim vim. Pentru aceasta, trebuie să-i dăm o comandă în care-i zicem că vrem să ieșim.

Dacă mai sunteți în modul Insert întoarceți-vă în modul Normal (cu ESC)

Tastați :. Observați că acum cursorul este pe linia de jos din terminal. Ați intrat în modul Command. Din acest mod putem executa comenzi.

Intrăm în modul Command cu :.

Dacă vrem să renunțăm la o comandă, putem folosi tasta ESC și ne întoarcem în modul Normal. Dacă vrem să executăm comanda, o terminăm prin Enter.

Pentru a ieși din vim folosim quit în modul Command. Putem abrevia comanda la q

În vim toate comenzile pot fi abreviate la o secvență neambiguă de litere.

Observați că nu putem părăsi editorul pentru că nu am salvat fișierul. Dați comanda write (sau w) și părăsiți editorul.

b. Deschideți din nou același fișier și introduceți o linie noua la începutul lui conținând textul: Steve Jobs at Standford, 2005.

Vrem să salvăm și să ieșim din vim fără a folosi 2 comenzi.

Fiind o combinație freceventă, comenzile write și quit pot fi date împreună în forma abreviată, sub forma wq.

Unele dintre cele mai folosite combinații de comenzi în vim pot fi folosite împreună în forma abreviată.

c. Deschideți din nou același fișier. Ștergeți prima linie din acesta.

Vrem să ieșim fără a salva modificarea. Nu putem da q simplu, trebuie să-i zicem că suntem siguri că dorim să ieșim fără să salveze. Folosim ! după comandă pentru a forța execuția ei.

Dacă vrem să forțăm execuția unei comenzi, folosim ! după aceasta.

6. Searching

Redeschideți fișierul. Vrem să căutăm aparițiile șirului life.

Pentru a lansa o căutare folosim / (căutare înainte, spre finalul fișierului) sau ? (înapoi, spre început). Observați că și acum cursorul este plasat pe ultima linie, exact ca-n modul Command.

Pentru a căuta următoarea apariție, putem folosi n sau Shift-n, în funcție de direcția în care vrem să mergem.

Găsiți a 4 apariție a șirului life de la începutul fișierului și apoi a treia repetiție spre începutul fișierului a șirului class de unde ați rămas.

Pornim o operație de search cu / (forward) sau ? (backward).

Căutăm următoarea apariție cu n (în aceeași direcție în care am început) sau Shift-n.

Observați asemnărarea cu o căutare prin man-pages.

Observați că se caută un șir, NU un cuvânt. Veți învăța în viitor cum introduceți noțiunea de cuvânt în căutare.

7. Replacing

Deschideti fișierul search_replace.

Vrem să înclocuim RPL1 cu asdf. Pentru a face aste lucru trebuie să intrăm în modul Command și să dăm o comandă care începe cu s/, ca mai jos:

s/RPL1/asdf

Formatul comenzii este următorul:

  • avem ca separator între câmpuri caracterul /
  • primul câmp reprezintă șirul ce trebuie înlocuit
  • al doilea câmp reprezintă expresia ce va fi înlocuită.

Se pot folosi și expresii regulate dar despre ele vom învăța într-un laborator viitor.

După Enter, se realizează înlocuirea și se revine în modul Normal.

b. Observați că s-a realizat doar o singură înlocuire, chiar dacă linia conținea mai multe potriviri. Pentru a forța înlocuirea pe toată lungimea liniei, adăugați un /g la finalul comenzii de replace.

/g semnifică potrivire globală, pe durata liniei curente.

c. Vrem să înlocuim șirul RPL2 cu qwert pe toată durata fișierului. Desigur, putem înlocui linie cu linie dar ar fi neproductiv. Pentru a face înlocuirea globală pe tot fișierul vom prefixa comanda de înlocuire cu %:

:%s/RPL2/qwert

Încercați și voi. De ce nu se înlocuiesc toate aparițiile? Rezolvați problema.

% semnifică potrivire globală pe tot fișierul

8. Selections

Vrem să înlocuim cuvântul RPL3 cu 1qaz dar doar pe primele 5 linii din fișier.

În acest caz, din ce știm până acum putem înlocui doar linie cu linie. Deoarece este un proces total ineficient, va trebui să selectăm întâi zona pe care vrem să facem înlocuirea pentru a putea da o singură comandă.

Pentru a face selecții, trebuie să intrăm în modul Vizual. Facem acest lucru folosind v astfel:

  • pentru selecție la nivel de caracter folosim v
  • pentru selecție la nivel de linie folosim V
  • pentru selecție la nivel de block (dreptunghiuri de text) folosim ^V (^ este Control)

Trecerea în modul Vizual se face utilizând tasta v (cu variantele V și ^V.

În modul Vizual ne deplasăm cu h, j, k, l ca în modul Normal.

Înlocuiți DONE cu done pe ultimele 5 linii din fișier. Pentru aceasta folosiți sintaxa de replace anterioară și pastrați caracterele '<,'> aparute în zona de comandă.

9. Copy-Paste-Cut-Delete

Folosiți fisierul search_replace. Conținutul lui nu este relevant.

Aproape tot timpul când editați ceva aveți nevoie să duplicați o bucată de text sau să o mutați. Într-un editor clasic foloseați Copy-Paste sau Cut-Paste. Și vim oferă acest lucru.

Putem șterge un caracter cu x dacă ne aflăm peste el. Încercați.

Putem șterge mai multe caractere cu d. Observați că nu se șterge nimic dacă apăsăm doar d. Trebuie să-i spunem și cât să șteargă.

Operațiile de copy și delete așteaptă o mișcare pentru a determina lungimea textului afectat.

Sau, le puteți folosi după ce ați selectat textul în modul Vizual.

Pentru a nu face mișcări lungi până la finalul rândului, de exemplu există scurtături. Încercați să vedeți ce fac dd și D.

Dacă vrem să lipim textul șters ne poziționăm în poziția dorită și folosim p sau P. Al doilea face paste înainte de poziția curentă.

Copiem textul cu y. La fel ca la d, trebuie o deplasare pentru a determina lungimea textului de copiat.

Ștergem text cu x sau d.
Lipim text șters sau copiat cu p sau P.
Copiem text cu y.

Ce se întâmplă dacă tastăm xp? Încercați să explicați cu noțiunile prezentate aici.

10. More movement

După cum ați observat în secțiunea anterioară, operațiile de copy și delete necesită o deplasare pentru a determina lungimea textului afectat. Ar fi ineficient să folosim doar h, j, k și l.

Din fericire, vim oferă operații complexe de deplasare, sumarizate în următorul tabel. Încercați să vă jucați cu toate.

comandă deplasare
^ începutul rândului
$ finalul rândului
w următorul cuvânt
e finalul cuvântului curent
b cuvântul anterior
gg prima linie din fișier
G ultima linie din fișier

De asemenea, puteți merge pe o anumită linie din fișier utilizând modul Command: :n vă deplasează pe linia n.

Utilizând cunoștințele de până acum, rezolvați următoarele taskuri într-un număr minim de taste.

- mergeți pe prima linie din fișier - copiați toată linia - mergeți pe ultima linie din fișier - faceți paste la linia copiată - mergeți pe linia 4 - copiați ultimul cuvânt de pe aceasta - mergeți pe ultima linie - faceți paste cuvântului copiat la finalul acesteia

11. More editing

Există și metode de intrare în modul Insert mai avansate. Tabelul următor ilustrează câteva din ele:

tastă acțiune
o pornește editare pe linie nouă sub linia curentă
O inserează o linie nouă deasupra liniei curente
a adaugă text după caracterul curent

Care este numărul minim de taste necesare pentru a rezolva următoarea situație?

# adăugati o linie nouă (la finalul fișierului) în care scrieți textul Acum stiu vim. # navigați la prima linie din fișier # navigați la ultima linie din fișier – cea introdusă # adăugați după vim textul si il folosesc

Punctul de la finalul propoziției trebuie să rămână acolo!

12. Ooops. Undo, undo, redo

Din când în când se întâmplă să facem o modificare greșită și să vrem să dăm înapoi. Într-un editor normal am fi folosit Ctrl-Z pentru undo.

vim poate face undo dacă sunteți în modul Normal și folosiți u.

Pentru redo, folosiți CTRL-r.

Încercați să vă întoarceți la starea originală a fișierului utilizând undo.

Reveniți la starea actuală folosind redo.

13. Where am I?

În anumite situații, veți dori să aveți afișat numărul fiecărei linii din fișierul curent. În modul Comandă, introduceți comanda set number. Puteți dezactiva cu set nonumber.

În alte cazuri, veți dori să aveți o metodă rapidă de a localiza cursorul în fișier. Introduceți, pe rând, comenzile set cursorline și set cursorcolumn.

Pentru a seta o opțiune folosiți comenzi de tipul set opțiune în modul Command.

Pentru a reseta o opțiune folosiți set noopțiune.

După ce asistentul verifică taskurile, puteți ieși din vim. Mergeți la secțiunea următoare.

Noțiunile prezentate aici vă vor fi utile în 90% din timpul petrecut lucrând în vim. Dacă le stăpâniți bine, totul este ok. Asigurați-vă că le știți până la următoarele laboratoare.

Secțiunile următoare încearcă să prezinte noțiuni ce vor spori productivitatea, fără a fi exhaustive. Cel mai bine este să folosiți vimtutor sau :h (:help) în vim.

Exerciții

1. Tabs

Uneori trebuie să edităm mai multe fișiere simultan. Desigur, putem deschide mai multe terminale sau mai multe taburi în același terminal dar nu vom putea copia text dintr-un fișier în celalt (încercați).

Putem folosi taburi în vim utilizând :tabnew (deci în modul Comandă).

Nagivarea între taburi se face cu gt și gT.

g este pentru orice fel de navigare. t și T sunt pentru taburi.

Deschideți 3 taburi în aceeași instanță de vim, scrieți text în primul și copiați-l în al treilea.

2. Split screen

Taburile sunt utile dar nu ne permit să vizualizăm simultan conținutul a mai multe fișiere. Pentru aceasta, folosim split views:

comandă efect
:sp split orizontal
:vsp split vertical

Comenzile din tabel sunt prescurtări pentru :split și :vsplit.

Navigarea între view-uri se face cu Ctrl+w și apoi Ctrl + litera asociată direcției de deplasare (h, j, k, l)

Deschideți 4 view-uri împărțind ecranul în 4 zone egale. Introduceți text într-o zonă și copiați-l în toate celelalte zone.

3. Cod sursă

Vim poate fi folosit pentru editarea codului sursă. Descărcați și dezarhivați arhiva ce conține un mic proiect ce folosește OpenGL. Scopul acestui exercițiu este să compilați acest proiect utilizând o singură sesiune de vim.

Sunt necesare cunoștințe minime de C, nu și de compilare.

Vedeți ce reprezintă :make, :cnext, :cprev și :copen în vim și folosiți-le pentru a compila și corecta sursa având deschis fișierul fps.cpp în vim.

Hint: folosiți :h (:help pentru a obține indicații)

4. Rulare comenzi externe

După ce am compilat executabilul vom dori să-l și rulăm. Putem părăsi vim pentru asta dar putem să-l rulăm și din interiorul vim.

Pentru aceasta, vom folosi modul Comandă dar vom prefixa comanda cu !. Pentru a rula executabilul va trebui să dăm comanda ./fps.

Rulați executabilul.

Pentru a permite navigarea ușoară prin codul sursă, vim interacționează ușor cu unelte precum ctags și cscope. În exercițiul curent vom folosi ctags, încercați să vă jucați voi cu cscope.

Ieșiți din vim dacă n-ați făcut deja asta și rulați

ctags *

Se construiește un fișier nou în care se găsesc informații despre fiecare identificator din sursele din directorul curent. Deschideți fișierul fps.cpp

vim fps.cpp

Căutați funcția main (hint: /).

Căutați apelul funcției init din cadrul funcției main. Pentru a sări la definiția funcției când ne aflăm pe apelul ei tastăm Ctrl + ].

Navigați până la definiția clasei Keyboard (găsiți o instanță a Keyboard în init sau folosiți căutare cu /).

Pentru a ne întoarce folosim Ctrl + T. Întoarceți-vă în funcția main.

Căutați definiția clasei Universe din funcția update (pe care o găsiți apelată în main).

6. Indentarea codului sursă

Pentru a avea un cod lizibil este recomandat să indentați instrucțiunile în cadrul funcțiilor și al blocurilor. Pentru a nu fi nevoiți să faceți asta manual, vim vine cu 2 opțiuni:

  • autoindent
  • cindent

Vedeți ce fac fiecare din ele și activați-le.

7. Salvare opțiuni vim. vimrc

Pentru a nu fi nevoiți să introduceți aceleași setări de fiecare dată când trebuie să porniți vim este bine să le salvăm într-un fișier numit .vimrc.

Sintaxa fișierului este puțin ciudată. Momentan, vom introduce opțiuni simple, pentru lucruri mai complicate va trebui să consultați documentația vim.

Vrem să setăm opțiunea textwidth la 79. În acest fel, vim va începe automat o linie nouă dacă depășim coloana 79.

Deschideți fișierul .vimrc din home-ul vostru și introduceți linia următoare:

set textwidth=79

Salvați și ieșiți. Deschideți o instanță de vim. Putem testa opțiunea introducând o linie foarte lungă și așteptând să vedem dacă ni se limitează linia la 79 de caractere.

Sau, putem să afișăm valoarea opțiunii. Folosiți (tw e prescurarea de la textwidth):

:set tw?

Pentru a afișa valoarea curentă a unei opțiuni în loc de a o activa se folosește un ? după aceasta.

Introduceți următoarele opțiuni în .vimrc:

  • cindent
  • autoindent
  • smartindent
  • incsearch
  • autowrite
  • hls
  • syntax on

Atenție!! syntax on nu este o opțiune în sine, nu se setează cu set!. Introduceți-o așa cum apare.

Aflați ce face fiecare din opțiunile introduse în .vimrc.

Puteți folosi fișierul .vimrc și acasă, conține setări minimale pentru un lucru eficient cu vim.

Pe internet există multe .vimrc publicate de utilizatorii vim. Recomandarea noastră este să vă inspirați din ele și să preluați ce pare interesant și util pentru voi.

Puteți folosi de exemplu:

8. Spellcheck

Puteți folosi vim și pentru a scrie text. În acest caz, o facilitate utilă este cea de spellcheck.

Există programe precum aspell dar vim vine integrat cu un modul de spell checking.

Pentru a-l activa, trebuie să setați opțiunea spell. Se vor colora imediat cuvintele greșite. Pentru a obține o listă de sugestii de corectare folosiți z=.

Activați facilitatea de spellcheck și corectați fișierul users.

9. Registre

După cum ați observat, ștergerea unei porțiuni de text va face ca următoarea comandă de tip paste să lipească textul șters. Dacă dorim să avem mai multe bucăți de text salvate pentru a fi lipite ulterior trebuie să folosim registre.

Pentru a salva într-un registru prefixăm comanda de ștergere cu și numele registrului. Pentru a-l folosi, procedăm similar.

Efectuați task-urile din 2_lines. Folosiți cât mai puține taste.

10. diffs

Pentru a vedea diferențele între două fișierele putem folosi diff. Pentru a crește productivitatea, vim vine cu vimdiff (shortcut pentru vim -d).

Folosiți vimdiff pentru a vedea diferențele între fișierele file1 și file2.

Modul de diff are multe opțiuni utile. Consultați-le în timpul liber (folosiți cu încredere :h vimdiff).

11. Macro-uri

Uneori este nevoie să repetăm aceeași secvență de acțiuni pentru mai multe linii. Pentru aceasta s-au creat macro-urile.

Pentru a porni înregistrarea unui macro se folosește q urmat de litera registrului în care trebuie salvat macro-ul.

Când se dorește terminarea macro-ului se folosește tasta q.

Pentru repetare, se folosește @ urmat de litera registrului în care a fost salvat.

Folosiți macro-uri pentru a insera , 3 înainte de ultima paranteză închisă de pe toate liniile din fișierul one_more_arg.c

Exista și o altă modalitate?

12. Emacs

Emacs este un alt editor foarte folosit. Există chiar un “război” celebru între utilizatorii vim și utilizatorii emacs, fiecare apreciind mai mult calitățile editorului propriu.

Spre deosebire de nano și vim, emacs nu este implicit pe toate platformele și va trebui instalat (nici vim în versiunea full nu este). Pentru laboratorul de azi, a fost preinstalat.

Pentru emacs, comenzile se dau folosind Ctrl (apar sub forma C-) sau Alt (M- de la Meta).

Nu-l vom folosi decât pentru a ieși din el. Folosiți C-x C-c.

Chiar dacă pare că trebuie să folosiți mai multe taste decât vim, acest lucru este esențial deoarece modurile (ca în vim) lipsesc.

Puteți învăța și Emacs. Majoritatea scurtăturilor și keybinding-urilor din diverse programe se bazează pe cele din Emacs. De exemplu bash și screen.

FIXME

systems/uso/laboratoare/laborator-03.1348169595.txt.gz · Last modified: 2012/09/20 22:33 by paul.vlase
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0