Vim

Autore originale: M3xican

Per chi non lo sapesse il VIM e' un potente editor di testo per linux, derivato dal vi, uno degli editor di testo di base dei sistemi unix-like. Siccome il VIM e' una versione avanzata del vi in genere lo si chiama vi, e anche in questa guida avverra' cosi' (pensate a quanti byte risparmiero' non scrivendo la M alla fine... ;)

La vera differenza tra un normale editor di testo (tipo notepad per intenderci) e il vi e' che quest'ultimo permette l'esecuzione di svariati comandi, la possibilita' di creare comandi personalizzati, la possibilita' di utilizzare script, la possibilita' di gestire finestre di testo multiple, l'assistenza fornita ai programmatori grazie all'opzione di indentazione (le varie spaziature che si inseriscono all'interno di un sorgente per renderlo piu' leggibile) automatica e alla presenza di schemi di colori che rendono i codici piu' facilmente leggibili (il migliore e' murphy). Oltre tutto quello gia' elencato si puo' dire che il vi e' stato pensato e realizzato per tutti quegli utenti "avanzati" che fanno ampio uso di editor di testo e che odiano dover spostare le mani dalla tastiera (ad esempio io... :), quindi anche se ad un principiante potrebbe dare inizialmente un'impressione di elevata difficolta' consiglio a tutti di imparare ad usarlo alla perfezione in quanto e' uno strumento indispensabile per la programmazione e l'hacking... ;)

In questa guida saranno analizzati (quasi) tutti i comandi utilizzati durante l'editing.

Iniziamo

In questo paragrafo descrivero' come creare dei file di testo e come editare dei file gia' esistenti. Per lanciare il vi basta digitare dalla shell:

 $ vim 

e premere INVIO. Cosi' facendo verra' eseguito il programma. Se pero' proverete a scrivere qualcosa vi accorgerete che c'e' qualcosa di strano... ovvero che non viene scritto niente! Il vostro primo pensiero sara' "Cominciamo bene...", ma non preoccupatevi, e' normalissimo, questo perche' il vi possiede due modalita' principali di funzionamento: una "comando" e una "inserimento".

Quando lanciate il programma partite sempre dalla modalita' comando, ovvero quella modalita' in cui potete eseguire i vari comandi disponibili, se invece volete scrivere qualcosa dovete passare in modalita' inserimento digitando il comando: i

Adesso potete scrivere quello che volete proprio come se stesse in un banalissimo editor di testo. Dopo ore e ore di scrittura (spero per voi sensata... :) arrivera' il momento in cui vorrete salvare il vostro lavoro, niente di piu' semplice! Basta tornare in modalita' comando premendo il tasto [ESC].

Adesso possiamo accedere ad una terza modalita', che e' una particolare modalita' comando detta "modalita' ultima linea" a cui si accede digitando: :

quando ci trova in modalita' comando. Adesso vedrete apparire il simbolo ":" all'inizio dell'ultima riga dell'editor, e il cursore posizionarsi dopo di esso. Questa modalita' puo' essere considerata come una sorta di shell del vi, qui infatti, per eseguire un comando e' necessario premere INVIO dopo averlo digitato. Adesso finalmente potete salvare il vostro file digitando:

 :w nome_file 

oppure

 :sav nome_file 

In entrambi i casi viene creato un file con il nome da voi indicato che contiene tutto quello che avete scritto fino a quel momento. Se oltre a salvare volete anche uscire dal vi non dovete fare altro che digitare:

:q

Una volta premuto INVIO ci si ritrova nella shell. Un ottimo sistema per ottimizzare il tutto e' quello di abbinare i comandi (caratteristica utilissima del vi), in pratica scrivendo:

 :wq nome_file 

Salviamo il nostro nuovo file e usciamo.

La modalita' comando del vim ha la funzione del completamento automatico premento il tasto TAB, come le normali shell, cio' e' sia utile che comodo per trovare comandi che non ci ricordiamo sia per scrivere piu' in fretta.

Quando poi abbiamo bisogno di tornare a lavorare sul nostro documento non dobbiamo fare altro che digitare dalla shell:

 $ vi nomefile 

Verra' riavviato il vi e caricato il file indicato come parametro sotto shell. Ora possiamo riprendere la stesura del nostro testo, pero' questa volta, quando avremmo bisogno di salvare bastera' passare in modalita' comando e digitare :w, mentre quando avremmo intenzione di salvare il nostro file con un nome diverso bastera' digitare ":sav nuovo_nome" (sempre dalla modalita' comando), tenendo ben presente che tutte le modifiche che verranno effettuate da quel momento in poi sul testo, una volta salvate, andranno applicate al nuovo file appena creato. In pratica "w" e' il corrispettivo di "salva" e "sav" e' il corrispettivo di "salva con nome".

Poiche' a tutti capita di sbagliare... nel caso abbiamo inavvertitamente modificato un file che non dovevamo toccare possiamo sempre uscire senza salvare. Per fare cio' e' necessario utilizzare l'operatore "!" che forza i comandi ed ignora i messaggi d'errore, in pratica bisogna digitare quanto segue:

 :q! 

Una volta tornati alla shell potrete verificare che il file non ha subito nessuna modifica visualizzandolo con un cat, rieditandolo col vi o verificando la data dell'ultima modifica con ls.

Come gia' vi ho detto il vi e' pensato per persone che non amano perdere molto tempo, soprattutto nella gestione dei comandi, una scorciatoia alla procedura di salvataggio e uscita spiegata poco prima e' il comando:

 ZZ 

tale comando salva il file (che deve essere un file gia' esistente) ed esce. In pratica si passa dalla sequenza:

 [ESC]
 :
 wq
 [INVIO]

alla sequenza:

 [ESC]
 ZZ 

non male vero? ;)

Se abbiamo aperto vim e volgiamo editare un file basta digitare:

 : edit ilnostrofile

Se abbiamo gia' aperto un file, bastera' digitare

 :edit altronomefile

e si passera al file altronomefile.

Muoviamoci

Basta parlare di vi, chiudiamo il file, spegniamo il pc e andiamo a fare un giro... :D Ok, avevo detto di smetterla... riprendo a fare il serio (che palle che siete! ;).

Fino ad ora avete imparato ad usare il vi come un semplice editor di testo, e' giunto il momento di iniziare ad usarlo in maniera piu' efficace. Ricordatevi di essere sempre in modalita' comando quando eseguite i comandi che sto per spiegare. I primi comandi da conoscere per potersi spostare all'interno di un file editato sono i seguenti:

  k
 h l
  j

L'ordine in cui li ho rappresentati non e' affatto casuale, infatti essi sono usati al posto delle frecce per muoversi sul testo: "h" sposta il cursore a sinistra, "j" in basso, "k" in alto e "l", indovinate un po'... a destra. Perche' usare questi tasti al posto delle frecce? Semplice, per non spostare le mani dalla zona centrale della tastiera!

I comandi appena descritti permettono di muoverci di un carattere alla volta, se invece abbiamo intenzione di spostarci di 'n' caratteri non dobbiamo fare altro che sfruttare un altra importantissima caratteristica del vi, ovvero la possibilita' di far eseguire un comando quante volte vogliamo. Per poter ottenere cio' basta anteporre al comando il numero 'n' di volte che vogliamo che esso venga ripetuto, quindi se un semplice "l" ci sposta di un carattre a destra:

 nl (dove "n" e' un numero) 

ci sposta di 'n' caratteri a destra. Questa utile caratteristica puo' essere utilizzata con quasi tutti i comandi che verranno illustrati in questo paragrafo, pertanto segnalero' solo i comandi che non possono utilizzarla, lasciandola sottintesa per tutti gli altri.

Alle volte puo' essere scomodo spostarsi di un carattere alla volta, questo soprattutto quando ci si deve posizionare alla fine della riga che si sta editando. Un comando che ci permette di effettuare uno spostamento piu' ampio e':

 w 

Che non fara' nient'altro che spostare il cursore sul primo carattere della successiva parola. Ricordate che tutti i segni di punteggiatura e i caratteri speciali sono considerati parole.

Se invece vogliamo spostarci sulla parola precedente e' necessario digitare il comando:

 b 

Ricordate che anche questo comando sposta il cursore sempre sul primo carattere della parola.

Se invece vogliamo spostarci di una parola in avanti, pero' sull'ultimo carattere bisogna digitare il comando:

 e 

Mentre per spostarsi sull'ultimo carattere della parola precedente:

 ge 

Da notare che quando ci si trova nel mezzo di una parola i comandi "b" ed "e" spostano il cursore rispettivamente sul primo e sull'ultimo carattere della parola stessa e che si spostano su di una parola successiva o precedente solo se il cursore si trova sul primo o sull'ultimo carattere della parola corrente.

Le versioni con i caratteri maiusoli spostano alla medesima maniera, ma su parole delimitate da spazi:

 W B E

Questi comandi ci permettono di spostarci lungo le parole, ma esistono anche dei comandi per spostarsi lungo le righe. Per spostarci alla fine della riga in cui e' presente il cursore e' necessario utilizzare il comando:

 $ 

Mentre per spostarsi sul primo carattere non di spaziatura di una riga si utilizza il comando:

 ^

Questo comando ignora qualsiasi numero gli sia anteposto.

Ci si puo' spostare perfino all'interno di frasi! Si perche' vim riconosce la puteggiatura e distingue le virgole dal punto, punto esclamativo, punto interrogativo, quindi puo' capire quando finisce una frase e comincia un'altra:

 (

va all'inizio di una frase.

 )

va alla fine di una frase

 {

va ll'inizio di un paragrafo

 }

va alla fine di un paragrafo.

Se invece ci si vuole spostare all'inizio di una riga, indipendentemente dal fatto che il primo carattere sia un carattere di spaziatura, si deve utilizzare il comando:

 0 (zero) 

Anteporre un numero a questo comando annulla il comando stesso, in pratica non si ottiene alcun effetto.

Quando si edita un testo si ha spesso la necessita di portarsi su di una riga in particolare, soprattutto quando si programma (dopo un errore segnalato dal compilatore ad esempio...). Per venire incontro a quest'esigenza il vi mette a disposizione alcuni comandi molto utili. Spesso e' utile visualizzare la fine di un documento, per spostarsi sull'ultima riga di un file si usa il comando:

 G 

Anteponendo un numero 'n' a questo comando ci si posizionera' sulla riga n-esima. Un altro modo per spostarsi all'n-esima riga e' quello di utilizzare il comando in modalita' ultima riga:

 :n 

dove 'n' e' il numero della riga in cui ci si vuole posizionare. Digitando ":$" si ottiene lo stesso effetto del comando "G". Mentre per spostarsi sulla prima riga c'e' il comando:

 gg 

Se invece ci si vuole spostare ad una certa percentuale del testo bisogna utilizzare il comando:

 %n 

Dove la 'n' e' la percentuale del testo che vogliamo raggiungere.

Alle volte e' anche utile spostarsi all'interno della finestra momentaneamente aperta, per permetterci movimenti relativi al suo interno il vi ci permette tre comandi:

 H 

posiziona il cursore sulla prima riga della finestra aperta

 M 

posiziona il cursore sulla riga mediana della finestra aperta

 L 

posiziona il cursore sull'ultima riga della finestra aperta. Pertanto se abbiamo aperto una finestra che contiene 9 righe l'esecuzione del comando "H" ci posizionera' sulla prima, il comando "M" sulla quinta e il comando "L" sulla nona.

Spesso si ha necessita di focalizzare quello che si legge su una riga ben precisa, ad esempio per avere una visione migliore di una parte di codice di un programma. Anche in questo caso sono presenti tre comandi dedicati a spostamenti della schermata relativi ad una riga:

 zz 

centra la schermata sulla riga in cui e' presente il cursore

 zt 

fa diventare la riga in cui e' presente il cursore la prima riga della schermata

 zb 

fa diventare la riga in cui e' presente il cursore l'ultima riga della schermata.

Un'altra potente caratteristica del vi e' la possibilita' di marcare le righe in modo da poterle raggiungere facilmente in seguito. Per marcare una riga e' necessario eseguire il comando:

 mx 

Dove 'x' e' la lettera che marchera' la riga. Per poter tornare su quella riga bastera' utilizzare il comando:

 'x 

dove 'x' e' la lettera che marca la riga che vogliamo raggiungere. Un utile comando da modalita' ultima riga e':

 :marks 

che mostra tutte le linee marcate e i corrispettivi caratteri associati.

Molto importanti sono anche i comandi dedicati allo scrolling, che permettono di spostarsi rapideamente all'interno del documento ed effettuare rapidi controlli. Le operazioni di scrolling nel vi non si limitano solo a quelle dei normali editor di testo (page down, page up), ma permettono un controllo maggiore degli scroll, andiamo a vedere come:

 CTRL+b (page up) 
 CTRL+f (page down) 

sono i classici comandi di scroll, che permettono di spostarsi di una schermata.

 CTRL+u 
 CTRL+d 

si spostano di mezza schermata, rispettivamente verso sopra il primo e verso sotto il secondo.

In conclusione (di questo paragrafo... la guida e' ancora lunga, e il bello deve ancora venire. Non sperate di cavarvela con cosi' poco! ;) voglio segnalare un comando utile durante la programmazione:

 % 

questo comando se eseguito su di una parentesi si posiziona sulla sua corrispettiva (di apertura o chiusura, a seconda di dove ci si era posizionati prima del comando).

Scriviamo

Editazione

Abbiamo imparato (almeno spero) come muoverci sul nostro documento, penso che ora sia arrivato il momento di sapere come editarlo nel migliore dei modi. Il comando principale per iniziare a scrivere e quello che abbiamo gia' visto nel 3° capitolo di questa guida, ovvero "i". Tale comando ci "sposta" in modalita' inserimento; dopo la pressione del tasto "i" possiamo iniziare a scrivere a partire dalla posizione che precede il cursore.

Se invece vogliamo iniziare a scrivere dalla posizione che segue quella corrente dobbiamo digitare il comando:

 a 

Tale comando spostera' il cursore di una casella a destra e ci portera' in modalita' inserimento.

Alle volte si ha bisogno di aggiungere delle cose alla fine di una riga, e nel vi non poteva mancare un comando per effettuare questa azione:

 A 

Tale comando portera' il cursore a destra dell'ultimo carattere non nullo della riga su cui ci si trova al momento della sua esecuzione e ci portera' in modalita' inserimento.

Un altro utile comando e' quello che ci permette di andare a scrivere dall'inizio della riga ovvero:

 I 

Un'altra coppia di comandi molto importanti e' quella che ci permette di aggiungere una riga al testo che stiamo editando, con:

 o 

Si aggiunge una riga sotto quella su cui e' presente il cursore al momento del comando, mentre:

 O 

Aggiunge una riga sopra quella corrente. Sebbene l'aggiunta di una riga sotto quella corrente puo' essere effettuata anche premendo INVIO il comando "O" risulta di indubbia utilita' in quanto ci permette di evitare un procedimento lungo per aggiungere una riga sopra quella che stiamo editando (ovvero sali su, posizionati alla fine della riga, premi INVIO). Dopo l'esecuzione di entrambi i comandi ci si ritrova in modalita' inserimento con il cursore posto all'inizio della riga appena creata.

Inserire file

Per inserire il contenuto di un file si usa il seguente comando:

 :r nome_file

Inserire output comandi

Per inserire l'output di un comando ecco cosa fare:

 :r! comando

Indentare

Una funzione molto comoda di vim, soprattutto per i programmatori, e' la possibilita' di indentare il codice. Con i simboli di minore e maggiore (< e >), la riga su cui si e' viene indentata in avanti o indietro.

Cancellazione

Durante la stesura dei nostri capolavori... :) ci capitera' spesso di sbaglire, il vi non puo' non venirci incontro anche questa volta. Il comando base per la cancellazione e':

 x 

Questo comando cancella il carattere sottostante il cursore, eseguendolo piu' volte si cancellano piu' caratteri. Digitando un numero 'n' prima di esso si cancellano 'n' caratteri a partire dalla posizione del cursore. Molto piu' pratico e' il tasto CANC mentre si e' in modalita' inserimento (mentre si scrive, senza dover premere ESC).

Invece il comando:

 X 

cancella il carattere posto a sinistra del cursore.

Per effettuare cancellazioni piu' "complesse" abbiamo a disposizione il comando "d" che di solito va abbinato ai comandi di posizionamento per ottenere l'effetto desiderato. Se ad esempio vogliamo cancellare una parola abbiamo a disposizione il comando:

 dw 

Tale comando accetta un numero posto tra le due lettere che lo compongono, in quanto si va ad indicare di quante parole ci si vuole spostare; pertanto per cancellare 'n' parole dobbiamo digitare il comando:

 dnw 

Dove 'n' e' il numero di parole che vogliamo cancellare. Lascio al lettore la sperimentazione delle varie combinazioni "d + comando_di_spostamento".

Per poter cancellare un intera riga si ha a disposizione il comando:

 dd 

che elimina la riga su cui e' posizionato il cursore, anche in questo caso anteponendo un numero 'n' al comando si cancellano 'n' righe.

Se invece vogliamo cancellare tutto quello che segue il cursore sulla riga in cui esso e' presente dobbiamo eseguire il comando:

 D 

Andando ad anteporre un numero 'n' al comando si cancellano 'n-1' righe a partire da quella su cui ci si trova, ovvero si cancella tutto quello che segue il cursore sulla riga in cui ci si trova e poi 'n-1' righe seguenti.

I comandi per la cancellazione appena citati lasciano il vi in modalita' comando. Se invece abbiamo bisogno di cancellare un qualcosa e poi trovarci in modalita' inserimento abbiamo bisogno di eseguire dei corrispettivi, ovvero:

 c al posto di "d" 
 cc al posto di "dd" 
 C al posto di "D" 

Questi comandi hanno lo stesso effetto dei loro corrispettivi, ma in piu' restituiscono la modalita' inserimento.

Alle volte ci si puo' sbagliare anche quando si effettua una cancellazione, per recuperare il testo eliminato abbiamo a disposizione il comando:

 u 

che in pratica e' il comando di undo, ovvero quel comando che annulla l'ultimo comando eseguito. Quando si e' proprio recidivi nel commettere errori, si puo' dover anche annullare l'annullamento di un comando (uno scioglilingua! :) in tal caso abbiamo a disposizione il comando per il redo:

 CTRL+r 

In pratica questi due comandi sono quelli rappresentati dalle frecce "avanti" e "indietro" nei vari programmi di grafica o di editazione testi. Ricordate che questi due comandi non agiscono soltanto con i comandi di cancellazione, ma bensi' con ogni comando eseguito.

Un altro utile comando che puo' essere associto alla coppia undo-redo e' il comando:

 . 

che ripete l'ultimo comando effettuato.

Modalita' visuale

Un'altra modalita' molto utile (ma quante sonoooo??? Basta!!! :) e' la modalita' visuale. Tale modalita' ci permette di selezionare un'area di testo su cui eseguire un comando. Dopotutto alle volte e' molto piu' comodo selezionare quello che si vuole cancellare mentre si legge un rigo che leggere il rigo, contare le parole da cancellare, posizionarsi sulla prima ed eseguire "dnw"! Comuque de gustibus... ognuno fa come meglio crede!

Allora, per passare in modalita' visuale bisogna utilizzare il comando:

 v 

una volta che ci si trova in modalita' visuale ci si puo' muovere sul testo come meglio si crede, spostandosi con i tasti direzione o con i comandi, gli spostamenti saranno sempre abbinati all'evidenziazione del testo. Quando abbiamo terminato di selezionare l'area che ci interessa non dobbiamo fare altro che smettere di spostarci ed eseguire il comando che desideriamo. Durante la selezione possiamo avere il bisogno di spostarci all'inizio dell'area evidenziata, per invertire la posizione del cursore abbiamo a disposizione il comando:

 o 

che sposta il cursore nel punto da cui abbiamo iniziato a selezionare, permettendoci poi di muoverci per selezionare all'indietro o per deselezionare il selezionato. Infatti per deselezionare un'area selezionata e' sufficiente ripassarci sopra con il cursore.

Quando abbiamo bisogno di selezionare righe intere possiamo usare il comando:

 V 

spostandoci verso l'alto o il basso possiamo selezionare/deselezionare tutte le righe che vogliamo e poi eseguire su di esse un comando, ad esempio una cancellazione o una copia.

Come abbiamo gia' visto fino ad ora il vi e' pieno di risorse, e cosi' nella modalita' visuale e' presente anche un supporto per le tabelle. Eseguendo il comando:

 CTRL+v 

si passa in un particolare tipo di modalita' visuale detta "visuale blocco" che permette di muoversi lungo le tabelle per selezionare gli elementi. Con la modalita' visuale blocco si puo' continuare ad utilizzare il comando "o" per spostarsi da un estremo all'altro della riga selezionata e in piu' si puo' utilizzare il comando:

 O 

per spostarsi diagonalmente all'interno dell'area selezionata. E' importante notare che i comandi "o" ed "O" eseguiti in modalita' visuale non sono gli stessi comandi eseguiti in modalita' comando, questo proprio grazie alle due differenti modalita'.

Se nella modalita' visuale blocco si preme "i", quello che succede per una riga, si ripercuote su tutte le altre.

Taglia, copia, incolla

Per completare le nostre operazioni di editazione del testo non possiamo non conoscere i classici comandi di taglia, copia, incolla. Il comando per copiare il testo e':

 y 

tale comando eseguito nella sua forma base (ovvero digitando solo 'y') copia un solo carattere, e piu' precisamente il carattere su cui e' presente il cursore. Pero' il vi permette di abbinarlo ai comandi di spostamento gia' visti (come nel caso della cancellazione) e alla modalita' visuale. Quindi ad esempio possiamo eseguire i seguenti comandi:

 yw 

che copia fino al carattere iniziale della parola successiva escluso, quindi se si hanno due parole e si e' posizionati sulla prima, eseguendo questo comando si copia la prima parola e in piu' lo spazio che le separa

 ye 

Che copia una parola, ma non lo spazio che segue

 y$  

che copia dalla posizione del cursore fino ala fine della riga, e cosi' via. Un altro utile comando e'

 Y 

oppure l'equivalente

 yy 

che copia la riga intera su cui e' posizionato il cursore.

Il vi apparentemente non possiede un comando per il taglio del testo, ma solo apparentemente... Infatti per eseguire un taglio di testo, ovvero un eliminazione di una determinata parte di testo e il suo inserimento da qualche altra parte, e' sufficente utilizzare i comandi di cancellazione. Infatti tutte le volte che cancelliamo una parte del testo, tale parte viene memorizzata in un buffer (in parole povere un contenitore temporaneo) e puo' essere incollata sul testo in un qualsiasi altro punto.

Per poter incollare il testo che abbiamo memorizzato nel nostro buffer temporaneo (dopo un operazione di copia o di taglio/cancellazione) abbiamo a disposizione due comandi:

 p 

incolla il testo prima del cursore, e

 P 

che incolla il testo dopo il cursore. Da notare che quando si esegue una copia o una cancellazione di un intera riga viene memorizzato anche il carattere di a capo, quindi andando ad eseguire il comando 'p' si incolla la riga sotto la riga corrente, ed eseguendo il comando 'P' sopra. Per evitare di dover cancellare lo spazio che si e' creato si puo' utilizzare la modalita' visuale andando a selezionare soltanto il testo.

Impostare una codifica diversa

Generalmente Vim riesce a indovinare la codifica con cui va letto un file, se dovesse sbagliarsi potete usare il comando ++enc= per poter vedere o scrivere il file in un altro formato. Immaginiamo di dover scrivere un file che avete in ISO 8859-1 e volete scriverlo in uft-8, per far cio' vi basta scrivere il seguente comando:

 :w ++enc=utf-8

e immediatamente avete il codice con la codifica utf-8.

Se volete imporre una codifica in lettura, i comandi sono analoghi:

 :edit ++enc=iso-8859-1

Ricerche

Un'azione molto ricorrente durante l'editazione di un testo e' la ricerca di una stringa, ovvero di un insieme di caratteri. Quando si ha a che fare con documenti composti da centinaia di righe e' praticamente impossibile sperare di effettuare questa ricerca "visivamente" e bisogna affidarsi a programmi (ad esempio "grep" sotto linux) e comandi di ricerca contenuti negli editor. Il vi presenta dui tipi di ricerca, la ricerca per carattere e la ricerca per stringa.

Ricerca per carattere

Il comando da utilizzare quando si vuole trovare la prima occorrenza di un carattere 'x' a partire dalla posizione del cursore e':

 fx 

per proseguire nella ricerca, ovvero per cercare una successiva occorrenza del carattere appena trovato, si usa il comando:

 ; 

Se invece si vuole cercare la prima occorrenza del carattere 'x' che precede la posizione del cursore (ovvero se si vuole cercare all'indietro), bisogna usare il comando:

 Fx 

in questo caso per proseguire con la ricerca a ritroso bisogna utilizzare il comando:

 , 

Una coppia di comandi simile a quella appena descritta e' quella costituita dal comando

 tx 

e dal comando

 Tx 

che in pratica svolgono la stessa funzione dei comandi "f" e "F", ma spostano il cursore non sul carattere trovato, ma bensi' sul carattere che lo precede.

Ricerca per stringa

Quando abbiamo bisogno di trovare una determinata stringa di testo all'interno di un file dobbiamo effettuare una ricerca con il comando:

 /stringa 

dove "stringa" e' la parola (o le parole) che vogliamo cercare, la ricerca avverra' dal cursore fino alla fine del testo. Se invece vogliamo effettuare una ricerca a ritroso, ovvero dal cursore fino all'inizio del testo, dobbiamo utilizzare il comando:

 ?stringa 

Un importante aiuto alle nostre ricerche e' dato dal carattere '.' che ha la stessa funzione del '?' sotto shell (ad esempio il comando 'ls cas?' elenca tutti i file contenuti nella directory corrente che iniziano per 'cas' e che sono costituiti da quattro lettere). Il carattere '.' infatti sostituisce a se stesso tutti i possibili caratteri, facendoci cosi' trovare tutte le possibili varianti di una parola in base ai nostri bisogni. Ad sempio il comando:

 /cas. 

eseguito prima della frase "Sono andato a casa per caso" segnalera' come trovate (evidenziera') le parole 'casa' e 'caso'.

Il carattere '.' non e' l'unico mezzo che abbiamo per specializzare le nostre ricerche, sono presenti anche altri operatori che aiutano il nostro compito. Infatti la semplice operazione di ricerca trova le occorrenze di una stringa all'interno del testo, il che significa che alle volte e' possibile ottenere come risultato della ricerca di una determinata parola una parte di un'altra parola (ad es.: ricercando 'ama' troviamo 'ama'to). Il vi ci viene incontro grazie alla sintassi:

 /parolaesatta\  

che effettua una ricerca proprio della stringa 'parola' (quindi ricercando 'ama' non ci viene evidenziato 'amato'). Ma questa non e' l'unica sintassi permessaci, infatti abbiamo anche la possibilita' di cercare tutte le parole che terminano con la stringa 'stringa' eseguendo il comando:

 /parola\>

se invece abbiamo bisogno di cercare una stringa posta soltanto all'inizio di una riga possiamo utilizzare la sintassi:

 /\^parola

mentre per cercare una stringa posta alla fine di una riga possiamo utilizzare:

 /$parola 

Da notare che i caratteri

 * [ ] ^  / % ? ~ $ 

sono considerati caratteri speciali e pertanto necessitano del carattere '

 

prima di essi all'interno della stringa. Ovvero se vogliamo cercare la stringa:

 /come stai\?

Due altri importanti comandi sono:

 * 

che effettua una ricerca nel testo della parola su cui e' presente il cursore al momento dell'esecuzione del comando e:

 # 

simile al precedente, ma effettua una ricerca a ritroso.

Non appena eseguiamo un comando di ricerca (ovvero non appena premiamo INVIO) il cursore viene posizionato sulla prima occorrenza della stringa trovata, se vogliamo spostarci su una successiva occorrenza dobbiamo eseguire il comando:

 n 

per spostarci invece su di un'occorrenza precedente dobbiamo utilizzare il comando:

 N

Ricerca incrementale

Se si vuole che vim comincia a cercare mentre noi digitiamo (come fa Firefox, quando cerca all'interno di un pagina) basta impostare:

 : set incsearch

Sostituzione

Sostituzione manuale

Un gruppo di comandi molto utili in fase di correzione o cambiamento di un testo e' quello relativo alle sostituzioni. In questo paragrafo sono presentati i vari comandi utilizzati per sostituzioni manuali, ovvero per quelle sostituzioni eseguite manualmente da chi edita il testo.

Il piu' semplice comando di sostituzione e' quello per sostituire un solo carattere:

 r 

tale comando deve essere eseguito posizionando il cursore sul carattere che vogliamo sostituire e poi digitando il nuovo carattere. Se ad esempio abbiamo scritto la parola "casa" e la vogliamo modificare nella parola "case" dobbiamo posizionarci sull'ultima lettera, digitare 'r' e poi digitare 'e'.

Se invece vogliamo sostituire un numero arbitrario di caratteri dobbiamo utilizzare il comando:

 R 

Tale comando ci spostera' in una nuova modalita' (ormai ho perso il conto... :), che possiamo chiamare di rimpiazzamento. Una volta terminate le nostre sostituzioni dobbiamo digitare ESC per tornare in modalita' comando.

Un ulteriore comando che puo' essere associato alle operazioni di modifica e':

 ~

eseguendo questo comando quando ci si trova con il cursore su di un carattere lo si cambia da maiuscolo a minuscolo e viceversa. Per eseguire questo comando su parole intere o gruppi di parole e' sufficiente selezionare il testo da convertire in modalita' visuale e poi eseguire il comando.

Sostituzione automatica

Alle volte eseguire sostituzioni manuali puo' diventare un'impresa impossibile, soprattutto se la sostituzione da effettuare e' frequente e il testo molto vasto. Per questo motivo il vi ci viene incontro con un utilissimo comando per la sostituzione automatica. In pratica noi non abbiamo altro da fare che specificare al comando la stringa che deve essere sostituita (s1) , la stringa che deve prendere il suo posto (s2) e un area (A) in cui effettuare la sostituzione, per ottenere la sostituzione di tutte le occorrenze di s1 con s2 all'interno di A.

Il comando di sostituzione di base e' un comando da modalita' ultima linea cosi' definito:

 :s/str1/str2 

dove "s" e' il comando vero e proprio, "str1" e' la stringa da sostituire e "str2" e' la stringa che deve prendere il posto di "str1". Questo comando andra' a sostituire alla prima occorrenza di "str1", nella riga in cui e' presente il cursore al momento di eseguire il comando, la stringa "str2". Se invece vogliamo sostituire tutte le occorrenze di "str1" su di una riga dobbiamo aggiungere un'opzione al comando, ovvero:

 :s/str1/str2/g 

dove "g" e' l'opzione appena citata ('g' sta per globale).

Con il comando di sostituzione "s" e' possibile effettuare alcune azioni abbastanza complesse non presenti nei vari comandi di sostituzione di casa MS (che pagate cari... il vi e' free! ;). Ad esempio possiamo andare a cancellare una stringa eseguendo il comando:

 :s/str1// 

che in pratica e' una sostituzione di "str1" con una stringa vuota.

Oppure il comando:

 :s/^/str2

che permette di andare ad aggiungere all'inizio della riga la stringa "str2" e il comando:

 :s/$/str2 

per andare ad aggiungere alla fine della riga la stringa "str2".

Se invece vogliamo andare ad ad concatenare "str2" a "str1" dobbiamo usare l'operatore & nel modo seguente:

 :s/str1/&str2 

il risultato di questa operazione sara' un'unica stringa formata dall'unione di "str1" e "str2" ovvero "str1str2".

Una maggiore potenzialita' del comando "s" e' fornita dalla possibilita' di specificare l'area di testo su cui devono essere eseguite le sostituzioni. Per fare cio' e' necessario utilizzare il comando "s" con una sintassi leggermente diversa ovvero:

 :a,bs/str1/str2 

dove 'a' e 'b' sono i due numeri di riga che delimitano l'area di testo in cui vogliamo effettuare le sostituzioni. Ricordate che il comando appena descritto non fa altro che cercare la prima occorrenza di "str1" nelle righe comprese tra 'a' e 'b' e sostituire ad essa "str2". Se invece abbiamo bisogno di sostituire tutte le occorrenze di "str1" con "str2" all'interno dell'intervallo specificato dobbiamo aggiungere alla fine del comando "/g", come ho mostrato in precedenza.

Similmente, per effettuare una sostituzione di tutte le occorrenze di "str1" all'interno del nostro testo dobbiamo eseguire il comando:

 :1,$s/str1/str2/g

come abbiamo gia' visto, infatti, il simbolo "$" viene interpretato dal vi come l'ultima riga. Un altro simbolo utilizzato e' "." che sta ad indicare la riga corrente. Questi due simboli possono essere usati per scrivere piccole espressioni che ci consentono di selezionare aree di testo relative ad alcune posizioni prefissate. Se ad esempio vogliamo eseguire una sostituzione in un'area di testo che parte dalla terza riga che precede la corrente e che finisce due righe prima dell'ultima riga del testo dobbiamo scrivere il comando con la seguente sintassi:

 :.-3,$-2s/str1/str2

Impostazioni

Il vi ci permette di impostare molte opzioni per rendere piu' agevole le nostre editazioni. In genere e' possibile attivare un opzione con il comando eseguito in modalita' ultima linea:

 :set opzione 

quando invece la si vuole disattivare bisogna eseguire lo stesso comando facendo pero' precedere al nome dell'opzione la stringa "no". Eccovi una lista di opzioni utili:

 :syntax enable 

Aggiunge i colori in modo da rendere piu' leggibile quello che scriviamo.

 :set number 

visualizza all'inizio di ogni riga il suo numero corrispondente.

 :set ignorecase 

ignora la differenza tra minuscole e maiuscole nelle ricerche.

 :set hlsearch 

attiva l'evidenziazione delle stringhe trovate da un'operazione di ricerca.

 :set incsearch 

inizia ad effettuare le ricerche durante la digitazione della stringa che si vuole trovare (quindi non aspetta la pressione di INVIO).

 :set autoindent 

Attiva l'autoindentazione, utile alla stesura di programmi facilmente leggibili.

 :set showmode 

mostra la scritta "- INSERISCI -" sull'ultima riga quando ci si trova in modalita' inserimento, ovvero ci segnala quando ci troviamo in modalita' inserimento (opzione molto utile per non eseguire comandi involontariamente).

Per impostare vi in modo che vada a capoa automaticamente ogni NUMERO di caratteri, bisogna usare l'opzione:

 set tw=NUMERO 

Siccome non e' molto conveniente impostare le opzioni desiderate ogni volta che si usa il vi esiste un file di configurazione che possiamo editare a nostro piacimento per configurare il programma come meglio ci aggrada. Il file in questione e' "vimrc" che dovrebbe essere contenuto nella directory "/usr/share/vim/" (oppure dentro ~/.vimrc), nel caso cosi' non fosse possiamo verificare la sua posizione grazie al comando:

 :scriptnames 

che visualizza il percorso di tutti i file di script del vi. Per far eseguire un opzione all'avvio del programma e' sufficiente inserire all'interno di questo file una riga simile alla seguente:

 set opzione 

Quando editerete questo file la prima volta noterete la presenza di tutte le opzioni impostate di base, le quali dovrebbero essere anche commentate, per poter annullare i loro effetti e' sufficiente eliminare la riga desiderata oppure porre un 'no' prima dell'opzione.

Per esempio il mio ~/.vimrc e' il seguente:

 set ignorecase
 set hlsearch
 set autoindent
 set showmode
 : syntax enable
 set bs=2
 set ls=2
 set ru

Utilizzare le finestre di vim

Anche se vim generalmente funziona in un terminale, alla sua maniera, puo' utilizzare le finestre. Per esempio se premete F1 mentre state lavorando su un file, la finestra si dividera' in due mostrando due finestre separate, quella della guida e quella del file che state editando.

E' possibile avviare vim con piu' finestre contemporaneamente digitando:

 vim file1 file2 file3

oppure

 vim -o3

In entrambi i casi apriranno tre finestre, nel primo caso per editare i 3 file scritti, nel secondo tre finestre vuote pronte per essere utilizzate.

Se invece volete dividere la finestra in cui voi seite in due digitate:

 :split

Per passare da una all'altra basta premere CTRL+w CTRL+w, oppure CTRL+w w.

Se volete dividere la finestra in due, ma con un altro file (per esmpio file2), basta digitare:

 :split file2

Per ingrandire la finestra premete CTRL+w +, per rimpicciorirla CTRL+w -.

Per dividere in due finestre verticali basta digitare:

 :vsplit

Inserire i simboli

Prima di tutto vi conviene imparare il codice del simbolo che volete inserire, per fare cio' vi basta digitare

 :digraph

apparira' una tabella con tutti i codici dei simboli (i codici sono 2 caratteri).

Quando volete inserire un codice vi basta premere CTRL+k, apparira' un punto interrogativo, inserite il codice del simbolo e questo verra' inserito nel testo.

Help

La mia guida benche' ampia non copre tutti gli aspetti del vi (che sono tantissimi), e magari quelli che copre non li spiega in maniera appropriata. Chi volesse imparare e/o capirci di piu' (spero tutti) su questo fantastico programma puo' consultare la guida on-line eseguendo il comando in modalita' ultima riga:

 :help 

La guida on-line contiene diversi link colorati in azzurro, tali link possono essere visualizzati posizionandosi con il cursore sopra e digitando "CTRL-]" (cioe' CTRL+ALTGr+'+' in una tastiera italiana).

Una guida piu' sintetica puo' essere visualizzate con il comando:

 :help index 

che visualizza la lista di tutti i comandi del vi (e sono molti...) con una breve descrizione associata. A tale guida si puo' accedere anche se si desidera visualizzare l'help per un comando, opzione o codice d'errore ben definito, per far cio' e' necessario eseguire il comando:

 :help stringa 

dove stringa rappresenta il comando, l'opzione o il codice d'errore sul quale si vogliono delle spiegazioni.

Se avete altri dubbi o chiedete o andate su http://www.vim.org .