Biologie | Chimie | Didactica | Fizica | Geografie | Informatica | |
Istorie | Literatura | Matematica | Psihologie |
Editorul Vi
Vi (visual editor) este un editor orientat ecran, deci conceput pentru echipamente de afisare cu ecran. El a fost realizat de Bill Joy, student la Universitatea Berkeley din California, ca o dezvoltare a editorului Ed. De fapt, Ex si Vi constituie 'interfetele' orientate linie, respectiv ecran, ale aceleiasi familii de editoare, derivate din Ed.
Vi este un editor conversational. Aceasta inseamna ca modul sau de lucru se bazeaza pe dialogul permanent al utilizatorului cu sistemul, deci pe repetarea unei secvente de actiuni in care:
utilizatorul transmite o comanda
editorul executa comanda
editorul afiseaza pe ecran modificarile rezultate din comanda
Fiind un editor orientat ecran, Vi foloseste particularitatile terminalului utilizat pentru afisare. Pentru o functionare coerenta, editorul se auto-adapteaza caracteristicilor terminalului, al carui tip il gaseste in variabila de sistem $TERM. Valoarea acestei variabile poate fi aflata prin comanda
$ echo $TERM
vt100
Utilizarea corecta a editorului presupune ca variabila $TERM este corect pozitionata, conform tipului de terminal utilizat efectiv pentru editare. Daca nu, valoarea variabilei poate fi modificata astfel:
$ TERM=linux; export TERM
daca interpretorul de comenzi este sh, sau
% setenv TERM linux
daca se foloseste csh. Apoi terminalul poate fi reinitializat cu
$ tset
Vom nota prin C-X combinatia obtinuta prin apasarea simultana a tastelor <Ctrl> si X.
Nota: Desi combinatia C-X este echivalenta cu C-x, trebuie retinut ca Vi face, in general, deosebire intre literele mari si cele mici corespunzatoare (este case-sensitive). De exemplu, :help este o comanda valida, pe cand :Help nu este.
In cazul in care anumite comenzi admit argumente optionale, acestea vor fi incadrate intre paranteze patrate ([ si ]).
Pornirea editorului
Lansarea in executie a editorului pentru a crea un fisier text, denumit exemplu.txt, se face cu comanda
$ vi exemplu.txt
Daca fisierul exista deja, continutul sau este incarcat pentru editare, altfel se creeaza un fisier nou cu numele respectiv. Daca nu este dat nici un nume de fisier, se creeaza un fisier nou, al carui nume va trebui precizat la prima salvare.
Se pot specifica mai multe fisiere intr-o singura comanda, de exemplu:
$ vi ch1.txt ch2.txt ch3.txt
In afara de parametrii nume de fisiere, Vi accepta si o serie de optiuni, descrise in detaliu in pagina de manual a editorului. Cateva din optiunile disponibile sunt urmatoarele:
n
pentru primul fisier pozitioneaza cursorul la inceputul liniei cu numarul n; daca n lipseste, cursorul va fi pozitionat la inceputul ultimei linii
sablon
pentru primul fisier pozitioneaza cursorul la inceputul primei linii care contine textul descris de sablon; comanda :help search-pattern poate fi folosita pentru informatii privind formatul sabloanelor de cautare
-b
editeaza in mod binar
-R
editeaza in mod read-only: este permisa modificarea tamponului de editare, dar continutul sau nu poate fi salvat pe disc; pentru a anula aceasta restrictie, comenzile de salvare pot fi completate cu !
-T terminal
comunica editorului tipul de terminal utilizat; optiunea este necesara atunci cand recunoasterea automata nu functioneaza, si poate fi modificata si in timpul sesiunii de editare cu ajutorul comenzii :set term=terminal
-u exrc
foloseste comenzile din fisierul exrc pentru initializare; informatii despre initializare se pot afla cu :help initialization
Modurile principale de lucru sunt cel de comanda (visual command mode) si cel de introducere a textului (visual text entry mode). Trecerea de la primul al al doilea se face prin comenzi specifice, iar revenirea in modul de comanda se face cu <Esc>. Daca pe terminalul utilizat pentru editare nu se dispune de aceasta tasta se poate folosi combinatia C-[. Exista si alte moduri de lucru (cum ar fi cel de editare orientata pe linii (line-oriented command mode)).
In regimul de comanda, toate caracterele introduse sunt interpretate drept comenzi. Ele sunt preluate imediat de editor, de aceea este important ca utilizatorul sa nu greseasca introducerea comenzilor, pentru ca nu exista posibilitatea editarii acestora. (Exista o exceptie, si anume comenzile in stil Ex, care incep cu caracterul ':' si care trebuie confirmate cu <Enter> pentru a fi executate). Totusi, o comanda partial introdusa poate fi anulata cu <Esc>.
Este foarte util de retinut ca majoritatea comenzilor care nu incep cu ':' pot fi precedate de un argument numeric, semnificand repetarea comenzii respective de acel numar de ori. Situatiile in care o comanda nu admite argument, sau in care prefixul numeric schimba comportarea acelei comenzi, vor fi mentionate explicit pe parcursul acestui tutorial. Si unele din comenzile Ex pot fi precedate de argumente numerice, insa acestea au alta semnificatie.
De asemenea, numele comenzilor care incep cu ':' pot fi prescurtate pana la lungimea minima neambigua (atat cat este posibil fara sa apara confuzii). De exemplu, in loc de :abbreviate se poate folosi :ab sau :abbre sau :abbrevi, dar nu :a, care provine de la :append. In continuare, pentru fiecare comanda vor fi mentionate atat forma intreaga, cat si cea prescurtata.
In regimul de introducere a textului orice caracter, cu exceptia lui <Esc>, este considerat ca parte a textului editat. Textul de lucru, cu modificarile aduse, este pastrat intr-un tampon, nu in fisierul original, care ramane nemodificat in timpul editarii. Actualizarea lui se face printr-una din comenzile de scriere (salvare). De asemenea, se poate memora rezultatul editarii intr-un fisier nou, pastrand astfel si fisierul original.
Tastand :set showmode sau :set smd in modul de comanda (la care se poate ajunge oricand cu <Esc>), bara de stare (ultima linie a ecranului) va afisa permanent in partea stanga modul curent de lucru (de exemplu -- INSERT --). Daca nu se afiseaza nimic, modul curent este cel de comanda.
Cateva din comenzile referitoare la lucrul cu fisiere sunt urmatoarele:
:write sau :w
salveaza continutul tamponului de editare in fisierul original
:write fisier sau :w fisier
salveaza continutul tamponului de editare in fisierul fisier
:write >> fisier sau :w >> fisier
adauga continutul tamponului de editare la sfarsitul fisierului fisier, care trebuie sa existe anterior acestei operatii
:wq sau ZZ
salveaza continutul tamponului de editare in fisierul original si termina sesiunea de lucru; :wq fisier salveaza continutul tamponului de editare in fisierul fisier si termina sesiunea de lucru
:edit fisier sau :e fisier
incarca pentru editare fisierul fisier (sau creeaza un fisier cu numele respectiv, daca acesta nu exista deja); argumentul fisier poate lipsi, caz in care se reincarca fisierul curent (fapt util in cazul in care fisierul respectiv a fost modificat intre timp din afara editorului)
:read fisier sau :r fisier
insereaza continutul fisierului fisier in tamponul curent, sub linia pe care se afla cursorul; daca argumentul fisier lipseste, se insereaza fisierul curent (cel de pe disc, deci cu continutul de la ultima salvare)
:quit sau :q
termina sesiunea de editare
Daca Vi a fost apelat cu mai multe fisiere ca parametri, urmatoarele comenzi permit trecerea de la un fisier la altul:
:next sau :n
incarca pentru editare urmatorul fisier din lista de argumente
:previous sau :prev
incarca pentru editare fisierul precedent din lista de argumente
:rewind sau :rew
incarca pentru editare primul fisier din lista de argumente
:last sau :la
incarca pentru editare ultimul fisier din lista de argumente
Toate cele patru comenzi de mai sus accepta un parametru care incepe cu caracterul +, cu urmatoarele forme si efecte asupra fisierului deschis pentru editare:
pozitioneaza cursorul la inceputul ultimei linii
n
pozitioneaza cursorul la inceputul liniei cu numarul n
<E
Cele mai simple comenzi sunt cele de mutare a cursorului cu o pozitie. Se utilizeaza in acest scop fie tastele directionale, fie urmatoarele taste sau combinatii de taste:
h sau C-H
o pozitie la stanga
j sau C-N sau C-J
o pozitie mai jos
l sau <Space>
o pozitie la dreapta
k sau C-P
o pozitie mai sus
Deplasarea se poate face si de la un cuvant la altul. Prin conventie, un cuvant este o succesiune de litere si/sau cifre sau o succesiune de semne de punctuatie. Un cuvant extins este o succesiune de caractere delimitata de spatii sau de caractere de sfarsit de linie. Astfel, cuvantul extins vi,emacs este compus din cuvintele vi, , si emacs.
Comenzile de deplasare la nivelul cuvintelor sunt urmatoarele:
w
un cuvant inainte
W
un cuvant extins inainte
b
un cuvant inapoi
B
un cuvant extins inapoi
e
la sfarsitul cuvantului
E
la sfarsitul cuvantului extins
Comenzi de deplasare relativ la linii:
sau 0
la inceputul liniei curente; nu admite prefix numeric
la inceputul liniei curente; daca este precedata de un numar, muta cursorul in coloana respectiva
la sfarsitul liniei curente
la inceputul liniei anterioare
C-M sau + sau <Enter>
la inceputul liniei urmatoare
Comenzi de deplasare relativ la unitati sintactice:
o propozitie inainte
o propozitie inapoi
un paragraf inainte
) inchisa/deschisa, atunci cursorul este mutat pe paranteza deschisa/inchisa corespunzatoare
In urma deplasarii, cursorul trebuie sa ramana in cadrul ecranului. De aceea, in cazul in care linia tinta este in afara partii afisate a textului, se modifica partea afisata astfel incat linia sa fie adusa pe ecran (textul 'defileaza' pe ecran).
Comenzile de defilare a textului pe ecran (scroll) sunt urmatoarele:
C-F
un ecran inainte (Forward)
C-B
un ecran inapoi (Backward)
C-U
o jumatate de ecran in sus (Up)
C-D
o jumatate de ecran in jos (Down)
C-Y
o linie in sus
C-E
o linie in jos
Nota: Numarul n de linii cu care se face defilarea in cazul comenzilor C-U si C-D se poate stabili cu :set scroll=n sau :set scr=n. Implicit, valoarea acestui parametru este jumatate din cea a optiunii lines, care poate fi modificata printr-o comanda :set similara (implicit este egala cu numarul de linii ale terminalului).
O comanda mai deosebita este z, care reafiseaza textul pe ecran conform urmatoarelor optiuni: z<Enter> pune linia curenta la inceputul ecranului, z. pune linia curenta in centrul ecranului, iar z- pune linia curenta la sfarsitul ecranului. Daca se furnizeaza un argument numeric, linia cu numarul respectiv devine linie curenta si asupra ei se aplica operatia specificata de sufixul comenzii. De exemplu, comanda 16z. muta cursorul la inceputul liniei 16, pe care o pune in centrul ecranului.
Defilarea textului pe ecran nu determina schimbarea pozitiei curente a cursorului in cadrul textului, cu exceptia situatiilor in care cursorul ar parasi ecranul.
Urmatoarele comenzi de inserare au ca efect trecerea din modul de comanda in cel de inserare text, in care tot ce se tasteaza (mai putin <Esc>) devine parte a textului editat. Inserarea se considera incheiata la apasarea tastei <Esc>, revenindu-se la regimul de comanda.
i
insereaza inaintea pozitiei curente
I
insereaza la inceputul liniei curente
a
insereaza dupa pozitia curenta
A
insereaza la sfarsitul liniei curente
o
creeaza o linie dupa linia curenta si insereaza
O
creeaza o linie inaintea liniei curente si insereaza
In cazul acestor comenzi, prefixarea cu argumente numerice are urmatorul efect: se intra in modul inserare de text, iar dupa ce se revine in regimul de comanda cu <Esc>, tot textul introdus este multiplicat de acel numar de ori.
Comenzi de inserare provenite din Ex:
:insert sau :i
insereaza linii de text inaintea liniei curente; daca se specifica un argument numeric (de exemplu :13i), inserarea se face inaintea liniei cu numarul respectiv; textul ce va fi inserat trebuie introdus de catre utilizator, sfarsitul sau fiind marcat cu un caracter . (punct), singur pe o linie.
:append sau :a
la fel ca :insert, dar textul va fi adaugat dupa linia respectiva
Nota: Uneori este utila inserarea in textul editat a caracterului <Esc>, de exemplu in cazul editarii unui fisier care trebuie sa contina secvente escape, sau daca se doreste definirea unei macrocomenzi. Acest lucru se poate face tastand (in modul inserare de text) C-V si apoi <Esc>. Pe ecran caracterul <Esc> va aparea ca
Pentru usurinta deplasarii in cadrul fisierului si a lucrului cu blocuri de text, pozitia curenta a cursorului poate fi marcata cu unul din caracterele a-z (echivalente cu A-Z). Rezulta ca la un moment dat pot exista in text 26 de marcaje. Marcarea se face cu ajutorul comenzii mx (mark), unde x este litera ce va fi atribuita pozitiei curente a cursorului. Revenirea la o pozitie marcata anterior se poate face cu `x, iar mutarea cursorului la inceputul liniei pe care se afla marcajul respectiv, cu 'x
Comenzile cele mai simple sunt r (replace) si s (substitute). Comanda r este insotita de un singur caracter, care-l va inlocui pe cel aflat in pozitia cursorului. De exemplu, rm inlocuieste caracterul curent cu m. Se pot folosi prefixe numerice: de exemplu 5rx inlocuieste urmatoarele 5 caractere (incepand cu cel curent) cu tot atatea caractere x.
Comanda s este insotita de un text si de <Esc>. Textul respectiv va inlocui caracterul indicat de cursor (sau un numar de caractere, incepand cu acesta, daca este furnizat un argument numeric): de exemplu, sptt<Esc> inlocuieste caracterul curent cu ptt. De fapt, dupa tastarea comenzii s se sterge caracterul curent (sau numarul respectiv de caractere) si se intra in modul de introducere a textului.
Pentru inlocuirea unor linii intregi se poate folosi una din comenzile S, care inlocuieste linia curenta (sau un numar de linii incepand cu aceasta) si C, care inlocuieste de la caracterul curent, inclusiv, pana la sfarsitul liniei (daca este precedata de un argument numeric n, sunt inlocuite si urmatoarele n-1 linii).
Comanda R are ca efect trecerea intr-un mod de inserare asemanator modului de suprascriere (overwrite) din alte editoare de text. In bara de stare se afiseaza -- REPLACE --, iar caracterele introduse vor inlocui tot atatea caractere, incepand cu cel din dreptul cursorului. Parasirea acestui mod se face cu <Esc>. Pe unele terminale, tasta <Insert> poate fi folosita pentru a comuta intre modurile -- INSERT -- si -- REPLACE --
O comanda mai puternica este c (change). c este, de fapt, doar o parte a comenzii, avand nevoie de un sufix care sa precizeze ce anume se inlocuieste. De aceea se numeste operator. Formele curente sunt urmatoarele:
cw
schimba de la pozitia curenta, inclusiv, pana la sfarsitul cuvantului
cW
schimba de la pozitia curenta, inclusiv, pana la sfarsitul cuvantului extins
cb
schimba de la inceputul cuvantului pana la pozitia curenta, exclusiv
cB
schimba de la inceputul cuvantului extins pana la pozitia curenta, exclusiv
cc
schimba linia curenta
c sau c0
schimba de la inceputul liniei pana la pozitia curenta, exclusiv; nu admite prefix numeric
c
schimba de la pozitia curenta, inclusiv, pana la sfarsitul liniei
c(
schimba de la inceputul propozitiei pana la pozitia curenta, inclusiv
c)
schimba de la pozitia curenta, inclusiv, pana la sfarsitul propozitiei
c
schimba de la pozitia curenta, inclusiv, pana la sfarsitul paragrafului
c`x
schimba regiunea dintre pozitia curenta si cea marcata cu x, inclusiv, dintre cele doua, caracterul aflat mai la stanga, si exclusiv celalalt
c'x
schimba regiunea dintre linia curenta si linia pe care se afla marcajul x, inclusiv
cnG
schimba regiunea dintre linia curenta si linia cu numarul n din fisier, inclusiv; daca n lipseste, se considera ultima linie din fisier
cnH
schimba regiunea dintre linia curenta si linia cu numarul n de pe ecran, inclusiv; daca n lipseste, se considera prima linie de pe ecran
cnL
schimba regiunea dintre linia curenta si linia cu numarul n de la baza ecranului in sus, inclusiv; daca n lipseste, se considera ultima linie de pe ecran
cM
schimba regiunea dintre linia curenta si linia de mijloc a ecranului, inclusiv
c
daca (virgula) caracterul curent este o paranteza ( ) inchisa/deschisa, atunci schimba regiunea dintre pozitia curenta si paranteza deschisa/inchisa corespunzatoare, inclusiv
Nota: Oricare din aceste forme are ca efect stergerea portiunii de text respective si intrarea in modul de introducere a textului.
Pentru inlocuirea unei anumite secvente de linii se poate folosi comanda :change sau :c, avand sintaxa :[secventa-de-linii]c. Dupa confirmarea comenzii (cu <Enter>), trebuie introdus un text (terminat cu caracterul '.' (punct), singur pe ultima linie), care va inlocui secventa de linii specificata.
Despartirea unei linii oarecare in doua linii succesive se poate face prin inlocuirea unui spatiu cu un caracter de sfarsit de linie (tastand r<Enter> cand cursorul este pozitionat pe spatiul respectiv), iar reunirea liniei curente cu urmatoarea se poate face cu comanda J (Join). Daca existau spatii la sfarsitul primei linii, acestea se pastreaza; daca nu, se pune un spatiu; spatiile de la inceputul celei de-a doua linii sunt sterse. Prefixarea comenzii cu un argument numeric are ca efect reunirea numarului respectiv de linii, incepand cu cea curenta.
O comanda utila poate fi si ~, care comuta caracterul curent din majuscula in minuscula si invers, dupa care muta cursorul pe caracterul urmator. Un eventual prefix numeric determina modificarea numarului respectiv de caractere, incepand cu cel curent, si pozitionarea cursorului dupa ultimul caracter modificat.
Cele mai simple comenzi de stergere sunt:
x
sterge caracterul din pozitia curenta, restul liniei deplasandu-se cu o pozitie spre stanga
X
sterge caracterul dinaintea cursorului, restul liniei deplasandu-se cu o pozitie spre stanga
D
sterge de la caracterul curent, inclusiv, pana la sfarsitul liniei; daca este precedata de un argument numeric n, sunt sterse si urmatoarele n-1 linii
O comanda mai complicata este d (delete). Ca si c, ea este un operator, fiind intotdeauna insotita de un sufix care precizeaza domeniul de actiune al comenzii.
De asemenea (analog comenzii :change), se poate folosi, pentru stergerea unei intregi secvente de linii, comanda :delete sau :d. Sintaxa este :[secventa-de-linii]d [x n], unde x este numele registrului in care va fi mutat textul.
Mutarea si copierea blocurilor de text se pot face in cadrul aceluiasi fisier sau intre fisiere diferite. In ambele cazuri se folosesc tampoanele interne (numite si registri) ale editorului:
Pentru mutarea unui bloc de text se procedeaza astfel:
Daca blocul a fost sters ca o secventa de caractere, el este inserat chiar in fata sau in spatele cursorului. Daca el a fost sters ca o secventa de linii (intregi), inserarea se face pe linia dinainte sau de dupa cursor, pozitia cursorului nefiind relevanta.
Pentru copierea unui bloc de text se procedeaza ca la mutare, folosind insa comanda y (yank), care are comportament de operator ca si c si d, acceptand aceleasi sufixe, si care copie in registrul anonim portiunea de text specificata de sufix. O comanda mai simpla este Y, care copie in registrul anonim linia curenta (sau un numar de linii incepand cu cea curenta, daca este precedata de un argument numeric).
Transferul de blocuri de text se poate face si prin intermediul registrilor cu nume, orice comanda de mutare, copiere sau inserare a blocului incepand cu indicarea registrului prin 'x, unde x este numele acestuia. De exemplu, 'a3dd muta trei linii in registrul a, 'by$ copie in registrul b textul de la pozitia curenta, inclusiv, pana la sfarsitul liniei, iar 'cp insereaza dupa cursor continutul registrului c.
Pentru copierea unei intregi secvente de linii se poate folosi si comanda :yank sau :y, sintaxa ei fiind identica cu cea a comenzii :delete.
Nota: In cazul mutarii sau copierii de text intr-unul din cei 26 de registri notati cu litere, specificarea acestuia cu litera mica are ca efect inlocuirea continutului registrului cu textul respectiv, iar folosirea literei mari corespunzatoare semnifica adaugarea textului copiat sau mutat la continutul curent al registrului. De exemplu, dupa comenzile 'a2yy si 'A5dd, o comanda de forma 'ap va avea ca efect inserarea in textul editat a sapte linii.
Cele mai simple comenzi permit cautarea unor litere izolate:
fc
muta cursorul inainte pana la prima aparitie a caracterului c din linia curenta
tc
muta cursorul inainte pana in fata primei aparitii a caracterului c din linia curenta
Fc
muta cursorul inapoi pana la prima aparitie a caracterului c din linia curenta
Tc
muta cursorul inapoi pana dupa prima aparitia a caracterului c din linia curenta
repeta ultima cautare in cadrul liniei, in acelasi sens
repeta ultima cautare in cadrul liniei, in sens contrar
Pentru cautarea unor succesiuni de caractere se folosesc urmatoarele comenzi:
sablon
cauta inainte textul descris de sablon; comanda :help search-pattern poate fi folosita pentru informatii privind formatul sabloanelor de cautare
sablon
cauta inapoi textul descris de sablon
n
repeta ultima cautare, in acelasi sens
N
repeta ultima cautare, in sens contrar
Note: Un eventual argument numeric n inaintea oricareia din cele patru comenzi de mai sus produce cautarea celei de-a n-a aparitii a textului descris de sablon, in directia specificata.
Implicit, in timpul cautarii editorul deosebeste literele mici de cele mari corespunzatoare. Acest lucru poate fi anulat cu ajutorul comenzii :set ignorecase sau :set ic. Revenirea la comportamentul initial se face cu :set noignorecase sau :set noic.
Inlocuirea unui sir de caractere cu altul se face cu comanda :s sau :substitute, avand sintaxa :[secventa-de-linii]s/sablon text flags n]. In flags se pot afla unul sau mai multe din urmatoarele caractere:
c
fiecare inlocuire va trebui confirmata; se poate raspunde cu:
y
efectueaza inlocuirea
n sau <Esc>
nu efectueaza inlocuirea
a (specific Vim)
efectueaza inlocuirea curenta si toate inlocuirile urmatoare
q (specific Vim)
abandoneaza cautarea
C-E sau C-e (specific Vim)
produce defilarea textului (scroll) cu o linie in sus
C-Y sau C-y (specific Vim)
produce defilarea textului (scroll) cu o linie in jos
e
inhiba afisarea mesajului de eroare 'No match' in cazul in care cautarea esueaza; optiunea este foarte utila in situatia in care comanda de inlocuire face parte dintr-o macrocomanda, pentru a preveni intreruperea acesteia
g
inlocuieste toate aparitiile sirului cautat din fiecare linie (implicit se inlocuieste numai prima aparitie)
i
ignora deosebirea dintre literele mari si literele mici in sirul cautat
I
face diferenta intre literele mari si literele mici in sirul cautat
p
afiseaza linia care contine ultima substitutie efectuata
Ultima inlocuire efectuata poate fi repetata cu comanda &. Pentru mai multe detalii si exemple se poate consulta asistenta on-line (:help :substitute).
Pentru indentarea liniilor sunt disponibile urmatoarele comenzi:
>>
deplaseaza linia curenta spre dreapta
<<
deplaseaza linia curenta spre stanga
Nota: Argumentul numeric, daca exista, precizeaza cate linii, incepand cu cea curenta, vor fi deplasate. Numarul n de pozitii cu care se face indentarea se poate stabili cu ajutorul comenzii :set shiftwidth=n sau :set sw=n (implicit 8).
De asemenea, la trecerea la o noua linie este posibila indentarea acesteia conform liniei precedente (noua linie va avea la inceput tot atatea spatii si/sau tab-uri cate avea si cea dinaintea ei). Pentru a activa autoindentarea se foloseste :set autoindent sau :set ai, iar pentru a o dezactiva, :set noautoindent sau :set noai. De-indentarea liniei curente se face cu comanda C-d sau C-D, activa numai in modul de inserare a textului.
Vi efectueaza automat word-wrap (inserarea unui caracter de sfarsit de linie), daca textul tastat pe o linie depaseste o anumita lungime. Acest parametru poate fi modificat cu :set wrapmargin=n sau :set wm=n, unde n este numarul minim de coloane care trebuie sa ramana libere in partea dreapta (deci pe un ecran cu 80 de coloane lungimea maxima a unei linii va fi 80 - n). Valoarea implicita a lui n este 0.
Nota: In distributiile Linux mai recente, optiunea wrapmargin este suprascrisa de textwidth (o extensie Vim), a carei valoare reprezinta lungimea maxima a unei linii. wrapmargin nu are efect decat daca textwidth este 0.
Pentru a facilita orientarea in cadrul textului, Vi poate numerota automat liniile pe masura ce ele sunt create sau sterse. Acest lucru se realizeaza cu ajutorul comenzii :set number. Numerele de linii afisate pe ecran nu fac parte din textul propriu-zis, ci au doar rol orientativ. Dezactivarea acestei facilitati se face cu :set nonumber.
In fine, se poate controla numarul de spatii echivalente cu un <Tab> atribuind valoarea corespunzatoare optiunii tabstop sau ts. De exemplu, :set ts=4 echivaleaza un <Tab> cu 4 spatii. Daca nu este stabilita la intializare, valoarea acestei optiuni este implicit 8.
u
anuleaza efectul ultimei comenzi
U
reface in totalitate ultima linie modificata
repeta ultima comanda
O macrocomanda reprezinta un substitut al unui grup de comenzi. Ori de cate ori utilizatorul introduce o macrocomanda, sistemul executa secventa de comenzi pe care aceasta le inlocuieste. Asocierea dintre macrocomanda si secventa de comenzi se poate face in mai multe feluri, de unde rezulta mai multe categorii de macrocomenzi: tampon, tasta functionala si abreviere.
Utilizatorul poate introduce o succesiune de comenzi intr-unul din tampoanele etichetate ale editorului, fie acesta x. Ori de cate ori se foloseste macrocomanda @x, se executa succesiunea de comenzi respectiva. Pentru exemplificare, sa consideram ca utilizatorul doreste sa creeze o macrocomanda pentru punerea intre paranteze rotunde a unui cuvant. Secventa obisnuita pentru aceasta este urmatoarea:
Pentru a defini o macrocomanda tampon cu aceasta succesiune de comenzi, putem proceda astfel:
se introduc
urmatoarele caractere:
i ) C-V <Esc> E a )
C-V
unde C-V inseamna <Ctrl>-V (apasarea simultana a tastelor
<Ctrl> si V), avand ca efect introducerea caracterului <Esc> in
linia curenta, fara ca el sa provoace imediat revenirea in modul de comanda
Pentru asocierea unei
taste functionale cu o macrocomanda se introduce o comanda de forma :map tasta comanda, unde
tasta se
poate specifica prin <fn>, <Fn> sau #n
(n fiind
numarul tastei functionale respective). Pentru a asocia tastei F2 secventa de
comenzi din exemplul anterior, se poate da una din formele:
:map <F2> i( C-V
<Esc> Ea) C-V
<Esc>
:map #2 i( C-V <Esc> Ea) C-V <Esc>
Din momentul definirii tastei F2, apasarea ei cand editorul se afla in modul de comanda produce executarea secventei de comenzi pe care o inlocuieste.
Aflarea asocierilor active la un moment dat se poate face cu ajutorul comenzii :map.
O tasta functionala poate fi asociata unui text oarecare printr-o comanda de forma :map tasta text. Acest tip de asociere este operativa numai in modul de introducere a textului. Pentru a afisa si acest tip de asocieri se poate folosi comanda :map!.
Prescurtarile permit asocierea unei notatii scurte cu un text mai lung. Forma generala a comenzii care realizeaza aceasta asociere este :abbreviate prescurtare text sau :ab prescurtare text, cu restrictia ca numele prescurtarii nu poate contine spatii.
De exemplu, dupa :ab pt pentru, ori de cate ori se tasteaza, in modul de introducere a textului, sirul 'pt', precedat si urmat de cate un caracter non-alfanumeric (care nu e litera sau cifra), 'pt' va fi automat inlocuit cu 'pentru'.
Daca se doreste ca o anumita aparitie a prescurtarii sa nu fie inlocuita cu textul corespunzator, chiar daca e precedata si urmata de caractere non-alfanumerice, primul caracter care urmeaza dupa prescurtare trebuie precedat de C-V. In exemplul anterior, pentru a scrie 'pt.' trebuie tastat ptC-V.
Omitand parametrul text se pot afla toate abrevierile care incep cu prescurtare, iar omitand ambii parametri se pot afla toate prescurtarile definite la momentul respectiv.
Anularea unei asocieri se poate face cu o comanda de forma :unabbreviate prescurtare sau :una prescurtare.
In multe sisteme Unix Vi poate fi suspendat in mod obisnuit prin C-z (numai in modul de comanda); in altele, aceasta combinatie de taste lanseaza un nou shell. Suspendarea editorului se poate face si printr-una din comenzile :suspend sau :sus si :stop sau :st.
In timpul unei sesiuni de editare poate fi lansat un interpretor de comenzi (shell) cu ajutorul comenzii :shell sau :sh. Numele si calea catre interpretor pot fi precizate ca valoare a optiunii shell, de exemplu prin :set shell=/bin/csh (implicit este shell-ul de login al utilizatorului). Revenirea in editor se face cu exit (nu este un shell de login, deci logout nu functioneaza).
Daca se doreste executarea unei singure comenzi shell, se poate folosi !comanda. De retinut ca in sirul comanda orice caracter ! este inlocuit cu comanda externa anterioara. Pentru a fi interpretat drept !, el trebuie precedat de . Rezulta de aici ca si caracterul are o semnificatie speciala, deci pentru a fi interpretat literal el trebuie dublat. De exemplu, daca dupa :!ls se scrie :!echo ! ! !, se va executa comanda echo ls ! !. Ultima comanda shell introdusa poate fi repetata cu :!!.
Uneori poate fi util ca rezultatul unei comenzi shell sa fie inserat in textul in curs de editare. Acest lucru se face cu ajutorul comenzii :read !comanda sau :r !comanda, textul rezultat fiind inserat imediat sub linia pe care se afla cursorul. Se aplica aceleasi observatii cu privire la semnificatia caracterelor ! si .
In fine, o facilitate interesanta oferita de Vi este posibilitatea de a filtra o secventa de linii de text printr-o comanda shell. Sintaxa generala este !<comanda-care-muta-cursorul><filtru>, unde filtru poate fi orice program care primeste text la intrarea standard, il prelucreaza si trimite rezultatul la iesirea standard. Efectul este inlocuirea regiunii de text dintre linia curenta si cea specificata de comanda de mutare a cursorului, inclusiv, cu iesirea programului daca ar fi avut ca intrare regiunea respectiva. Cateva exemple:
!4jsort
sorteaza urmatoarele 5 linii, incepand cu cea curenta
!`agrep the
pastreaza din liniile cuprinse intre cea curenta si cea pe care se afla pozitia marcata cu 'a', inclusiv, numai pe cele care contin textul 'the'
!Ltr '[a-z]' '[A-Z]'
in toate liniile cuprinse intre cea curenta si ultima de pe ecran, inclusiv, caracterele alfabetice litere mici vor fi inlocuite cu majusculele corespunzatoare
O varianta mai simpla este !!filtru, care filtreaza linia curenta (sau n linii incepand cu cea curenta, daca este precedata de un argument numeric n).
O a treia varianta, care permite specificarea mai exacta a secventei de linii care va fi filtrata, este :[secventa-de-linii]!filtru.
Nota: Filtrarea regiunilor de text are loc la nivel de linie. De exemplu, comanda !wtr x y inlocuieste caracterului 'x' cu 'y' in toata linia curenta, desi comanda w muta cursorul numai pana la sfarsitul cuvantului curent.
Asistenta online
Pentru obtinerea de asistenta (help) se foloseste comanda :help topic sau :h topic, unde topic este comanda, optiunea sau capitolul despre care se solicita informatii. Daca argumentul topic lipseste, va fi deschis fisierul principal de help. In textul afisat pot exista trimiteri (tag-uri) catre alte parti ale documentatiei online, sub forma |ident| (de exemplu |hidden-buffer|). Se poate 'sari' la capitolul corespunzator fie cu comanda :tag ident sau :ta Nota: Desi sistemul de asistenta online este de fapt o completare adusa de Vim, am considerat necesar si util acest capitol, dat fiind faptul ca in majoritatea distributiilor Linux actuale 'standardul' este Vim.
Optiuni
Comportamentul editorului Vi poate fi controlat prin modificarea valorilor numeroaselor sale optiuni, fie de la linia de comanda, fie in timpul sesiunii de editare, cu ajutorul comenzii :set. Exista doua categorii de optiuni:
Multe din optiuni au si denumiri prescurtate (shiftwidth - sw, autoindent - ai, etc). Lista tuturor optiunilor disponibile poate fi obtinuta cu :set all, iar informatii despre o anumita optiune cu :help optiune
Copyright © 2024 - Toate drepturile rezervate