Table of Contents

Folosire Vim

Video tutorials

Suport laborator

Cheat sheet

Movement

Complete

More cheatsheets

Pachete necesare

Arhivă laborator

Introducere

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

Înainte de a începe tutorialul de aici vă recomandăm să parcurgeți lecțiile din vimtutor. Sunt 7 lecții care vă trec prin comenzile de bază și lucrați direct pe textul din vimtutor, fără a fi nevoie să deschideți alt terminal.

Rulați comanda:

student@uso:~$ vimtutor

Editorul vim. Intro

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:

Veți observa cum partea de jos a ecranului se modifică modul în care suntem:

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. Mai jos sunt câteva exemple:

Tastă Trecere efectuată
i din Normal în Insert
v din Normal în Visual
: din Normal în Comand
R (SHIFT+R) din Normal în Replace
Insert din Insert în Replace

Pentru a deschide un fișier se folosește următoarea comandă (dacă dăm mai multe fișiere ca arguemnte vor fi deschise și ele, dar în față avem primul fișier dat ca argument):

vim my_super_file

Odată ce a fost deschis, vim se va afla în modul Normal. Pentru a naviga prin fișier se folosesc tastele h, j, k, l exact ca în figura următoare.

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ă.

Evident, se pot deschide mai multe fișiere:

vim file1 file2

Atenție la denumirile fișierelor care conțin spații. Dacă avem astfel de fișiere trebuie să folosim \ sau ghilimele pentru a escapa spațiul

Deseori 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 folosind comenzile vim (trebuie să folosim copy/paste la nivelul sistemului).

vim -p file1 file2 file3 file4

și folosim combinațiile de taste:

Putem folosi taburi în vim utilizând :tabnew (deci în modul Comandă), dacă am deschis doar un fișier. Fără nici un argument :tabnew deschide un fișier gol. Îi putem da ca argument doar un singur fișier deja existent.

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

Însă dacă, de exemplu, avem un fișier header cu definițiile a foarte multe funcții sau macro-uri am vrea să îl avem undeva în stânga sau în dreapta pentru a putea apela corect acele funcții în codul nostru. Pentru a vizualiza simultan conținutul a mai multe fișiere folosim split views:

Comandă Formă scurtă Efect
:split :sp split orizontal
:vsplit :vsp split vertical

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

Aceste splits ar putea fi folosite și pentru compararea a două surse. Dar, de exemplu, scriem cod în echipă și vrem să comparăm fișierul nostru original cu ce a adăugat nou un coleg al nostru e mai bine să folosim un utilitar care semnalează diferențele între cele două fișiere pe care le vizualizăm. Pentru aceasta putem folosi vimdiff (care uneori poate fi mai util decât diff din linia de comandă). vimdiff e un shortcut pentru vim -d. Dacă aveți nevoie de ajutor :h vimdiff

vimdiff file1 file2
vim -d file1 file2

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.

Pentru a ne întoarce în modul Normal din modul Insert putem folosi tasta ESC.

Pentru a putea introduce o comandă va fi necesar să ne aflăm în modul Command. Pentru a intra în acesta, veți tasta :. Veți observa că acum cursorul este pe linia de jos din terminal.

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.

În cazul în care am modificat fișierul, nu vom putea părăsi editorul folosind comanda quit, deoarece nu am salvat modificările. Pentru a salva modificările realizate în fișier, vom folosi comanda write (sau w). După ce am salvat fișierul, putem ieși din acesta fără probleme.

Putem salva și ieși 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ă.

Dacă vrem să ieșim fără a salva modificarea, nu putem da q simplu, trebuie să spunem editorului 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 în Vim, folosim ! după aceasta.

Dacă am deschis mai multe fișiere și vrem să le închidem pe toate o dată trebuie să folosim qa. Dacă vrem să salvăm toate modificările: wqa

Comenzi frecvente și utile în vim

Sumarizăm mai jos câteva din cele mai frecvente comenzi în vim, foarte utile la început. O listă detaliată cu comenzi găsiți aici

Comandă Mod Descriere scurtă
write Command salvează modificările
quit Command iese din fișier
x Normal cut pentru un caracter
d Normal șterge următorul movement
d Visual șterge textul selectat
y Normal copiază următorul movemet
y Visual copiază textul selectat
s Command search and replace

Searching

De multe ori, vrem să căutăm într-un fișier anumite secvențe.

Pentru a lansa o căutare folosim / (căutare înainte, spre finalul fișierului) sau ? (înapoi, spre început). Se poate observa 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.

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.

Replacing

De multe ori, într-un fișier, vrem să înlocuim un șir cu alt șir. Pentru a face aste lucru trebuie să intrăm în modul Command și să dăm o comandă care începe cu s/, de exemplu:

s/old_string/new_string

Formatul comenzii este următorul:

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.

Folosind comanda în formatul prezentat, se va realizeaza doar o singură înlocuire, chiar dacă linia conținea mai multe potriviri. Pentru a forța înlocuirea pe toată lungimea liniei, vom adăuga un /g la finalul comenzii de replace.

Vrem să înlocuim toate aparițiile șirului old_string în fișier cu șirul new_string. 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 %:

Această comandă nu înlocuiește toate aparițiile, vedeți mai jos de ce:

:%s/old_string/new_string

Această comandă înlocuiește în tot fișierul, prima apariție de pe fiecare linie. Pentru a obține înlocuirea pe întregul fișier, va trebui să înlocuim toate aparițiile de pe toate liniile. În acest sens, vom folosi atât % cât și g, ca în exemplul:

:%s/old_string/new_string/g

Selections

Vrem să înlocuim șirul old_string cu new_string 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:

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

Copy-Paste-Cut-Delete

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.

Putem șterge mai multe caractere cu d. N se șterge nimic dacă apăsăm doar d, trebuie să-i spunem și cât să șteargă.

Exemple:

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 există scurtături. Comanda dd șterge linia curentă, iar D șterge restul liniei curent.

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.

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

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.

More editing

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

Comandă 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
A adaugă text la finalul liniei curente
I adaugă text la începutul liniei curente

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 clasic foloseați Ctrl + z.
În vim folosiți următoarele comenzi în modul Normal:

Comandă Acțiune
u undo
CTRL + r redo

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.

Putem seta toate aceste opțiuni să pornească o dată cu pornirea lui vim prin crearea unui fișier în home directory-ul nostru numit .vimrc și în care punem toate aceste opțiuni pe care le vrem neapărat la pornirea editorului. Un exemplu cu comentarii găsiți aici, și unul mai simplu aici

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:

Exerciții

Toate cunoștințele necesare pentru a rezolva primele 2 secțiuni se găsesc în partea de introducere. Ulterior, fiecare exercițiu conține și o descriere a ceea ce vi se cere.

1. Vim Basic Usage

Search and replace
Copy-Paste-Cut-Delete
Rezolvare
dl sau x
Rezolvare
/My third<Enter>dd
Rezolvare
ggYp
Rezolvare
Gdd:3<Enter>P
Rezolvare
:4v4jd
Undo, redo

2. Efficient Editing

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

  1. deschideți fișierul search_replace.
  2. mergeți pe linia 4
  3. copiați toată linia
  4. mergeți pe ultima linie din fișier
  5. faceți paste la linia copiată
  6. mergeți pe prima linie
  7. copiați ultimul cuvânt de pe aceasta
  8. mergeți pe ultima linie
  9. faceți paste cuvântului copiat la finalul acesteia

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

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

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

3. 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.

4. 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ă Formă scurtă Efect
:split :sp split orizontal
:vsplit :vsp split vertical

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.

5. Rulare comenzi externe

Cel mai probabil dorim să ne ținem fișierele organizate pe disk. Pentru asta, atunci când facem un nou fișier, am vrea să-l salvăm într-un director anume. Dacă acel director nu există deja, nu putem să salvăm direct, așa că va trebui să îl creăm.

Putem, bineînțeles, face asta închizând Vim, sau dintr-un alt termial, dar putem lucra și mai eficient, rulând comanda direct din Vim.

Putem rula orice comandă externă dacă o prefixăm cu !. De exemplu, pentru a crea un director nou numit new_dir în directorul de unde am lansat Vim, vom rula:

 :!mkdir new_dir 

Acest lucru este în special folositor atunci când scriem cod și dorim să compilăm fără să părăsim editorul.

Rezolvare
!gcc permutari.c
!./a.out

6. 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, folosind set inainte de ele:

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.

7. 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. Încercați să fiți cât mai eficienți, folosind mișcările descrise în Introducere/More Movement.

8. 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.

Format comandă: “rop, unde:

Exemplu:

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

9. 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).

10. 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.

ăvem următoarea succesiune de pași pentru a crea un macro:

exemplu de linie
alt exemplu de linie

exemplu de linie NEWLINE
alt exemplu de linie

exemplu de linie NEWLINE
alt exemplu de linie NEWLINE


Comandă Mod Descriere scurtă
qa Normal porniți înregistrarea unui macro în registrul a
q Normal opriți înregistrarea dacă a fost pornită anterior
@a Normal repetați macro-ul salvat în registrul a


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?