post

Vim ro:Tot editare

Contents

Introducere

Să construim pe baza a ceea ce am învăţat până acum alte trucuri de editare în Vim.

Afişarea fişierelor şi citirea comenzilor

Am învăţat deja să edităm şi să scriem fişiere, dar Vim crede că mai sunt destule lucruri pe care le putem face.

Dacă vreţi să deschideţi un fişier fără să îl editaţi? Puteţi realiza aceasta cu comanda vim -R care porneşte Vim în mod read-only (rom. numai citire). Sau dacă aveţi fişierul deja deschis în Vim, puteţi lansa :set ro pentru a face bufferul read-only. Avantajul folosirii acestei opţiuni este că afişarea fişierelor mari va fi mai rapidă pentru că Vim mu mai trebuie să-şi facă griji cu modificarea acestora.

Dar dacă vreţi să inseraţi conţinutul unui unui fişier in fişierul curent? Lansaţi :r alt_fisier.txt şi conţinutul acelui fişier va fi “citit” şi inserat în buferul curent. Aceasta metoda este utila în multe circumstanţe precum combinarea a două fişiere sau efectuarea unei copii sau obţinerea unui fisier cu doar câteva modificări ş.a.m.d.

Un efect secundar interesant al comenzii :r este că o puteţi folosi pentru a citi rezultatul afişat al unei comenzi, nu doar fişiere.

De exemplu, instalaţi programul GCal şi lansaţi:

:r !gcal -s1 -K

Această cpomandă inserează calendarul lunii curente (!gcal) cu săptămânile începând cu Luni (s1) şi cu afişarea numărului săptămânii (K). Textul va arăta cam aşa:

         April 2007
    Mo Tu We Th Fr Sa Su CW
                       1 13
     2  3  4< 5> 6  7  8 14
     9 10 11 12 13 14 15 15
    16 17 18 19 20 21 22 16
    23 24 25 26 27 28 29 17
    30                   18

Imaginaţi-vă posibilitaţile de a folosi comenzi externe pentru a adăuga informaţii relevante la propriul text…

Înregistraţi toate aceste amintiri

Să luăm exemplul nostru obişnuit:

I have coined a phrase for myself – ‘CUT to the G’:

1. Concentrate
2. Understand
3. Think
4. Get Things Done

Step 4 is eventually what gets you moving, but Steps 2 and 3 are equally important. As Abraham Lincoln once said “If I had eight hours to chop down a tree, I’d spend six hours sharpening my axe.” And to get to this stage, you need to do Step 1 which boils down to one thing – It’s all in the mind. That’s why it’s so hard.

Să zicem că vrem să copiem cele patru puncte bullet în alt loc, poate la cuprins. De asemenea vreţi să mutaţi propoziţia a doua în altă parte. N-ar fi comod ca deocamdată să stocăm ambele obiecte text în locuri diferite, să lucrăm mai departe şi mai târziu să le lipim? Aceasta se face folosind registre, care sunt zone de memorie unde putem stoca text şi putem dispune de el rapid, mai târziu.

De exemplu, puteţi să plasaţi cursorul pe linia care conţine textul 1. Concentrate şi să introduceţi "a4yy:

  • "a → foloseşte registrul numit ‘a’
  • 4 → execută de 4 ori operaţia
  • yy → copiază o linie

Cu alte cuvinte “copiază următoarele 4 linii în registrul ‘a'”.

Pentru pasul următor puteţi selecta vizual a doua propoziţie din ultimul paragraf apoi să apăsaţi "bd pentru a o ‘d’ecupa şi a o depune în registrul ‘b’.

Acum, că aţi copiat textele respective în buffere, puteţi lipi textul oriunde vreţi – doar apăsaţi "ap pentru a lipi conţinutul registrului ‘a’ şi "bp pentru a lipi ce avem în registrul ‘b’ ş.a.m.d.

Pentru a ne reaminti ce avem în registre, lansăm:

:registers

Observaţi cât de mult amplifică Vim conceptul simplu de “clipboard”!

A se citi :help registers pentru diverse tipuri de registre în Vim.

Formatarea textului

Vreţi să centraţi un text? Să luăm textul următor:

   ACESTA ESTE TITLUL

Rulaţi doar:

:set textwidth=70
:center

Veţi obţine următorul rezultat:

                           ACESTA ESTE TITLUL

Setarea :set textwidth=70 va face ca toate paragrafele să aibă o lăţime maximă de 70 de caractere, iar dacă scrieţi rânduri mai lungi de 70, Vim mută automat pe rândul următor cuvintele care depăşesc limita.

De exemplu, să luăm textul:

   Step 4 is eventually what gets you moving, but Steps 2 and 3 are equally
   important. As Abraham Lincoln once said "If I had eight hours to chop down a
   tree, I'd spend six hours sharpening my axe." And to get to this stage, you need
   to do Step 1 which boils down to one thing - It's all in the mind. That's why
   it's so hard.

Paragrafele au fost scrise cu textwidth de 80. Vrem să reformatăm paragraful ca să intre în 70 de coloane (caractere). Aşadar rulăm

:set textwidth=70
gwap

A doua comandă poate fi înţeleasă ca:

  • gw înseamnă formatează acest text şi fugi (engl. ‘g’o) înapoi acolo (engl. ‘w’here) unde eram
  • ap Înseamnă un ‘p’aragraf.

Voila! Textul devine:

   Step 4 is eventually what gets you moving, but Steps 2 and 3 are
   equally important. As Abraham Lincoln once said "If I had eight hours
   to chop down a tree, I'd spend six hours sharpening my axe." And to
   get to this stage, you need to do Step 1 which boils down to one thing
   - It's all in the mind. That's why it's so hard.

A se citi :help formatting şi :help formatoptions pentru mai multe detalii.

De asemenea, similar cu :center, mai există comenzile :left şi :right pentru aliniere la stânga, respectiv la dreapta.

Căutare şi înlocuire

Am învăţat să săutăm un text. Dar cum să căutăm şi să înlocuim, din aceeaşi mişcare? Păi, folosiţi comanda :s.

De exemplu, să zicem că avem textul:

   Setp 4 is eventually what gets you moving, but Setps 2 and 3 are equally
   important. As Abraham Lincoln once said "If I had eight hours to chop down a
   tree, I'd spend six hours sharpening my axe." And to get to this stage, you need
   to do Setp 1 which boils down to one thing - It's all in the mind. That's why
   it's so hard.

Vrem să înlocuim toate expresiile greşite setp cu step. Deci lansaţi:

:s/setp/step/g

Această comandă ar trebui să fie citită astfel:

:s/schemă/text înlocuitor/opţiuni

Deja am văzut că schemele pot fi atât de complexe cât avem nevoie. Textul sau schema înlocuitoare are de asemenea o sintaxă specială pentru a utiliza schema originală. De exemplu dacă vrem să interschimbăm două cuvinte, putem folosi:

:s/(Petre) (Popa)/2 1/g

Aşa textul se va transforma din Petre Popa în Popa Petre.

Opţiunile pot specifica în ce fel trebuie să lucreze înlocuirea. Implicit, căutarea şi înlocuirea acţionează numai asupra primei apariţii a schemei în linie. Pentru a o face să lucreze asupra tuturor apariţiilor, dăm opţiunea g de la ‘g’lobal. Dacă vrem o confirmare a fiecărei modificări specificăm c care înseamnă ‘c’onfirmă fiecare înlocuire.

Abrevieri

Uneori avem de scris acelaşi text de multe ori. De ce să nu folosim prescurtări? În Vim sunt numite abrevieri.

De exemplu, dacă scrieţi repetat textul Compania Super Minunată Privată srl, atunci puteţi lansa:

:iab csmp Compania Super Minunată Privată srl

De acum, când scrieţi în editor textul c, s, m, p, <space>, acesta va fi înlocuit automat cu expresia Compania Super Minunată Privată srl!

Lansaţi :verbose abbreviate pentru a vedea o listă de abrevieri deja stabilite.

A se vedea :help:ab şi :help:unab pentru detalii.

Verificarea sintaxei

O facilitate importantă adăugată în ultima lansare Vim, versiunea 7 este verificarea sintaxei. Astfel Vim poate verifica textul pentru a permite corectarea lor simplificată.

Mai precis, Vim caută cuvinte care sunt prezente pe o “listă de cuvinte bune”, adică un dicţionar aflat într-un fişier şi apoi marchează cuvintele rămase ca fiind erori posibile.

Să începem cu textul următor:

   Setp 4 is eventually what gets you moving, but Setps 2 and 3 are equally
   important. As Abraham Lincoln once said "If I had eight hours to chop down a
   tree, I'd spend six hours sharpening my axe." And to get to this stage, you need
   to do Setp 1 which boils down to one thing - It's all in the mind. That's why
   it's so hard.

Pentru a activa corecţia erorilor, lansaţi comanda:

:setlocal spell spelllang=en_us

Aici ‘en’ reprezintă limba ‘engleză’ şi ‘us’ reprezintă Statele Unite ale Americii (presc. USA). Puteţi alege limba şi regiunea în funcţie de text. Totuşi, fişierele dicţionar trebuie să fie instalate în directorul $VIMRUNTIME/spell/. În caz contrar, Vim va întreba dacă să descarce un astfel de dicţionar de pe websitul Vim.

Vim va afişa o linie roşie zimţată sub cuvântul “Setp” şi alte greşeli similare. Culoarea exactă depinde de setarea parametrului colorscheme.

Tastaţi ]s pentru a vă deplasa la următorul ‘cuvânt rău’, adică scris incorect.

Acum apăsaţi z= pentru a-i cere lui Vim sugestii de cuvinte corecte. El va afişa o listă de opţiuni. Puteţi tasta numărul opţiunii care credeţi că e corectă şi enter pentru a înlocui cuvântul cu opţiunea selectată sau doar enter pentru a renunţa la corectură.

Dacă vreţi să vedeţi pentru fiecare cuvânt un scor referitor la cât de ‘bună’ este fiecare opţiune de înlocuire, rulaţi :set verbose=1 şi apoi z=.

În cazul nostru, putem înlocui “Setp” cu “Step”, dar avem acelaşi cuvânt din nou. Ar fi mai bine dacă am putea face înlocuirea peste tot în text. Pentru asta trebuie să rulăm :spellrepall.

Să considerăm textul:

   Swaroop is a name.

În acest caz, Vim marchează cuvântul ‘Swaroop’ ca “rău”. Noi ştim că este un nume şi pentru interesul nostru, vrem să-l adăugăm la lista de cuvinte bune, ca să nu mai fie marcat de fiecare dată. Pentru asta putem lansa zg pentru a-l face bun (engl. ‘g’ood).

Pentru mai multe informaţii despre ce fişier dicţionar este folosit, puteţi da comanda :spellinfo.

Mie mi se pare util că pot activa/dezactiva verificarea automată ca să nu intervină în editarea normală. Prin urmare am adăugat următoarele rânduri în fişierul vimrc pentru a comuta folosind tasta F4:

" Spell check
function! ToggleSpell()
    if !exists("b:spell")
        setlocal spell spelllang=en_us
        let b:spell = 1
    else
        setlocal nospell
        unlet b:spell
    endif
endfunction

nmap <F4> :call ToggleSpell()<CR>
imap <F4> <Esc>:call ToggleSpell()<CR>a

Verificarea sintaxei este un subiect uriaş pe cont propriu, aşa că dacă sunteţi interesaţi cum este implementată în Vim sau cum puteţi adăuga cuvinte sau liste de cuvinte la dicţionarul vostru favorit, a se vedea :help spell.

Selecţia cu dreptunghi

Când edităm date tabelare, uneori vrem să copiem doar unele coloane din text nu câteva linii. Pentru asta, putem folosi selecţia unui bloc rectangular în Vim apăsând ctrl-v.

Să considerăm următorul text:

   1. Concentrate
   2. Understand
   3. Think
   4. Get Things Done
  1. Plasaţi cursorul pe litera majusculă ‘C’ din prima linie.
  2. Apăsaţi ctrl-v.
  3. Apăsaţi 3j pentru a vă deplasa în jos trei linii.
  4. Apăsaţi $ pentru a ajunge la sfârşitul liniei.
  5. Apăsaţi y pentru a copia textul în registrul implicit.
  6. Rulaţi :new şi apăsaţi p pentru a lipi selecţia dreptunghiulară.

Noul fişier ar trebui să arate aşa:

   Concentrate
   Understand
   Think
   Get Things Done

A se vedea :help ctrl-v pentru detalii.

Editarea fişierelor distante

Puteţi edita direct un fişier distant (engl. remote) într-un site ftp folosind Vim. Trebuie doar să rulaţi în Vim comanda vim ftp://ftp.foo.com/bar sau :Nread ftp://ftp.foo.com/bar.

Aici se foloseşte un plugin predefinit “netrw” cu ajutorul căruia puteţi edita fişiere distante şi via scp, http, webdav şi alte protocoale. See :help netrw-urls for details.

Puteţi chiar să furnizaţi conturi de acces (= username + parolă) în fişierul vostru ~/.netrc astfel încât Vim să poată realiza loginul în mod automat.

A se vedea :help netrw-start pentru detalii.

Rezumat

Am făcut o incursiune ceva mai adâncă în domeniul facilităţilor de editare oferite de Vim. Asta ar trebui să vă dea o idee destul de bună despre ce putem face cu el. Repet, ceea ce contează nu este să ştim fiecare facilitate ci a învăţa ceea ce este important pentru voi chiar acum şi a transforma acest lucru în obicei; apoi să învăţăm alte facilităţi/opţiuni/pluginuri pe măsură ce ne sunt necesare.

Ar fi o idee bună să răsfoiţi capitolul “Editing Effectively” din :help user-manual şi să citiţi ce vi se pare interesant.