This shows you the differences between two versions of the page.
systems:uso:laboratoare:laborator-03 [2012/09/20 22:39] paul.vlase [Materiale ajutătoare] |
— (current) | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== 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. | ||
- | |||
- | <code bash> | ||
- | gedit | ||
- | </code> | ||
- | |||
- | 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''**. | ||
- | |||
- | <code bash> | ||
- | nano | ||
- | </code> | ||
- | |||
- | Ș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: | ||
- | |||
- | {{http://elf.cs.pub.ro/uso/store/03_vim_modes.png?nocache}} | ||
- | |||
- | * 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 | ||
- | |||
- | <note tip> | ||
- | 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ă. | ||
- | </note> | ||
- | |||
- | |||
- | ==== 3. Navigare în fișier ==== | ||
- | |||
- | Deschideți fișierul **''steve jobs''** utilizând **''vim''** folosind una din comenzile următoare: | ||
- | |||
- | <code bash> | ||
- | vim "steve jobs" | ||
- | vim steve\ jobs | ||
- | vim ste<TAB> | ||
- | </code> | ||
- | |||
- | Sunteți în modul __Normal__. Puteți naviga prin fișier folosind tastele h,j,k,l exact ca în figura următoare. | ||
- | |||
- | {{http://elf.cs.pub.ro/uso/store/03_vim_nav_keys.png?nocache}} | ||
- | |||
- | <note hint> | ||
- | 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 | ||
- | </note> | ||
- | |||
- | <note tip> | ||
- | 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ă. | ||
- | </note> | ||
- | |||
- | 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) | ||
- | |||
- | <note tip> | ||
- | Intrăm în modul __Insert__ cu **''i''**. | ||
- | </note> | ||
- | |||
- | |||
- | ==== 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. | ||
- | |||
- | <note tip> | ||
- | Intrăm în modul __Command__ cu **'':''**. | ||
- | </note> | ||
- | |||
- | 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''** | ||
- | |||
- | <note info> | ||
- | În **''vim''** toate comenzile pot fi abreviate la o secvență neambiguă de litere. | ||
- | </note> | ||
- | |||
- | 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''**. | ||
- | |||
- | <note tip> | ||
- | Unele dintre cele mai folosite combinații de comenzi în vim pot fi folosite împreună în forma abreviată. | ||
- | </note> | ||
- | |||
- | 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. | ||
- | |||
- | <note tip> | ||
- | Dacă vrem să forțăm execuția unei comenzi, folosim **''!''** după aceasta. | ||
- | </note> | ||
- | |||
- | |||
- | ==== 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. | ||
- | |||
- | <note tip> | ||
- | 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''**. | ||
- | </note> | ||
- | |||
- | <note important> | ||
- | Observați asemnărarea cu o căutare prin man-pages. | ||
- | </note> | ||
- | |||
- | <note warning>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.</note> | ||
- | |||
- | |||
- | ==== 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: | ||
- | |||
- | <code bash> | ||
- | s/RPL1/asdf | ||
- | </code> | ||
- | |||
- | 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ă. | ||
- | |||
- | <note> | ||
- | Se pot folosi și expresii regulate dar despre ele vom învăța într-un laborator viitor. | ||
- | </note> | ||
- | |||
- | 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. | ||
- | |||
- | <note tip> | ||
- | **''/g''** semnifică potrivire globală, pe durata liniei curente. | ||
- | </note> | ||
- | |||
- | 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 **''%''**: | ||
- | |||
- | <code bash> | ||
- | :%s/RPL2/qwert | ||
- | </code> | ||
- | |||
- | Încercați și voi. De ce nu se înlocuiesc toate aparițiile? Rezolvați problema. | ||
- | |||
- | <note tip> | ||
- | **''%''** semnifică potrivire globală pe tot fișierul | ||
- | </note> | ||
- | |||
- | |||
- | ==== 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) | ||
- | |||
- | <note tip> | ||
- | Trecerea în modul __Vizual__ se face utilizând tasta **''v''** (cu variantele **''V''** și **''^V''**. | ||
- | </note> | ||
- | |||
- | Î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ă. | ||
- | |||
- | <note warning> | ||
- | 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__. | ||
- | </note> | ||
- | |||
- | <note important> | ||
- | 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''**. | ||
- | </note> | ||
- | |||
- | 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. | ||
- | |||
- | <note tip> | ||
- | Ștergem text cu **''x''** sau **''d''**.\\ | ||
- | Lipim text șters sau copiat cu **''p''** sau **''P''**.\\ | ||
- | Copiem text cu **''y''**. | ||
- | </note> | ||
- | |||
- | 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''** | ||
- | |||
- | <note important>Punctul de la finalul propoziției trebuie să rămână acolo!</note> | ||
- | |||
- | |||
- | ==== 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''**. | ||
- | |||
- | <note tip> | ||
- | 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''**. | ||
- | </note> | ||
- | |||
- | După ce asistentul verifică taskurile, puteți ieși din **''vim''**. Mergeți la secțiunea următoare. | ||
- | |||
- | <note important> | ||
- | 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''**. | ||
- | </note> | ||
- | |||
- | |||
- | ===== 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''**. | ||
- | |||
- | <note info> | ||
- | **''g''** este pentru orice fel de navigare. **''t''** și **''T''** sunt pentru taburi. | ||
- | </note> | ||
- | |||
- | 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 [[http://elf.cs.pub.ro/uso/store/uso-lab3-grf.zip | 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) | ||
- | |||
- | <solution> | ||
- | <code bash> | ||
- | $ vim fps.cpp | ||
- | :make | ||
- | ENTER | ||
- | dd (se sterge redefiniția lui EPS) | ||
- | :make clean | ||
- | :make | ||
- | </code> | ||
- | </solution> | ||
- | |||
- | |||
- | ==== 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. | ||
- | |||
- | <solution> | ||
- | :!./fps | ||
- | </solution> | ||
- | |||
- | |||
- | ==== 5. Navigare prin cod sursă ==== | ||
- | |||
- | 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 | ||
- | |||
- | <code bash> | ||
- | ctags * | ||
- | </code> | ||
- | |||
- | 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''** | ||
- | |||
- | <code bash> | ||
- | vim fps.cpp | ||
- | </code> | ||
- | |||
- | 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: | ||
- | |||
- | <code bash> | ||
- | set textwidth=79 | ||
- | </code> | ||
- | |||
- | 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''**): | ||
- | |||
- | <code bash> | ||
- | :set tw? | ||
- | </code> | ||
- | |||
- | <note tip> | ||
- | Pentru a afișa valoarea curentă a unei opțiuni în loc de a o activa se folosește un **''?''** după aceasta. | ||
- | </note> | ||
- | |||
- | 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''**. | ||
- | |||
- | <note tip> | ||
- | Puteți folosi fișierul **''.vimrc''** și acasă, conține setări minimale pentru un lucru eficient cu **''vim''**. | ||
- | </note> | ||
- | |||
- | <note important> | ||
- | 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: | ||
- | * https://github.com/ddvlad/cfg/blob/master/_vimrc | ||
- | * http://swarm.cs.pub.ro/~mihai/.vimrc | ||
- | </note> | ||
- | |||
- | |||
- | ==== 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''**. | ||
- | |||
- | <note tip> | ||
- | Modul de diff are multe opțiuni utile. Consultați-le în timpul liber (folosiți cu încredere **'':h vimdiff''**). | ||
- | </note> | ||
- | |||
- | |||
- | ==== 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 |