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ă.
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
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.
Evident, se pot deschide mai multe fișiere:
vim file1 file2
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:
gt
- next tabgT
- previous tabXgt
- unde X = un număr întreg - navigare la tab-ul X
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
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
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
.
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.
!
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
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ă |
---|---|---|
w rite | Command | salvează modificările |
q uit | 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 |
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.
De multe ori, într-un fișier, vrem să înclocuim 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:
/
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 %
:
:%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
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:
v
V
^V
(^
este Control)
În modul Vizual ne deplasăm cu h, j, k, l
ca în modul Normal.
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:
dl
, șterge un caracter la dreaptadxh
, șterge x caractere la stânga (x este un număr)
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.
yxl
, copiază următoarele x caractere spre dreapta, unde x este un număr.yy
, copiază întreaga linie pe care se află cursorul.
Ce se întâmplă dacă tastăm xp
? Încercați să explicați cu noțiunile prezentate aici.
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
.
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 |
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 |
Î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
.
set opțiune
în modul Command.
Pentru a reseta o opțiune folosiți set no
opțiune
.
.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:
steve jobs
(Atenție: există un spațiu în numele fișierului, folosiți `\ ` sau ghilimele).steve jobs
.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.search_replace
.RPL1
cu asdf
doar pe prima linie.RPL2
cu qwert
în întregul fișier.RPL3
cu 1qaz
dar doar pe primele 5 linii din fișier.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ă.steve jobs
.dl
sau x
/My third<Enter>dd
ggYp
Gdd:3<Enter>P
:4v4jd
Utilizând cunoștințele de până acum, rezolvați următoarele taskuri într-un număr minim de taste.
search_replace
.Care este numărul minim de taste necesare pentru a rezolva următoarea situație?
Acum stiu vim.
si il folosesc
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.
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.
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
.
!
. 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.
permutation.c
în vim.gcc
.gcc -o NUME_EXECUTABIL FIȘIER_SURSĂ
!gcc permutari.c !./a.out
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?
?
după aceasta.
Introduceți următoarele opțiuni în .vimrc
, folosind set
inainte de ele:
cindent
autoindent
smartindent
incsearch
autowrite
hls
syntax on
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
.
.vimrc
și acasă, conține setări minimale pentru un lucru eficient cu vim
.
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
.
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:
r
- registrul folositop
- comanda dată în modul NormalExemplu:
“ayy
- copiaza întreaga linie pe care se află cursorul în registrul a.“aP
- adaugă linia copiată în registrul a deasupra liniei pe care se află cursorul.
Efectuați task-urile din 2_lines
. Folosiți cât mai puține taste.
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
.
:h vimdiff
).
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:
qa
, unde a este registrul în care vreți să salvați macro-ul. (Putea fi orice litera din intervalul a-z). O să observați că va apare jos în stânga textul “recording”.
exemplu de linie
alt exemplu de linie
$
.a
pentru a adăuga după cursor.
exemplu de linie NEWLINE
alt exemplu de linie
q
pentru a salva macro-ul. j
.@a
în modul Normal pentru a repeta macro-ul salvat în registrul a. O să observați că a fost adăugat textul ” NEWLINE” la sfârșitul liniei, așa cum ați făcut în timpul înregistrării pentru prima linie.
exemplu de linie NEWLINE
alt exemplu de linie NEWLINE
N@a
(N este un număr).
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?