Vi è stato il primo editor a tutto schermo. Rappresenta uno dei principali punti criticati dai detrattori di UNIX, ma è allo stesso tempo uno dei principali argomenti dei suoi difensori: sebbene sia complicato da imparare, è anche uno strumento estremamente potente una volta che ci si abitua a usarlo. Con poche pressioni dei tasti un utente di Vi può smuovere le montagne e, a parte Emacs, di pochi editor di testo può essere detta la stessa cosa.
La versione fornita con Mandrake Linux è in realtà vim, che sta per VI iMproved, ma in questo capitolo lo chiameremo comunque Vi.
Prima di tutto, come avviarlo: esattamente come Emacs. Quindi riprendiamo i nostri due file e digitiamo:
$ vi file1 file2 |
Vi trovate ora di fronte al primo file aperto, in modalità comandi. In questa modalità non potete inserire testo in un file. Per farlo dovete andare in modalità inserimento, e perciò dovete digitare uno dei comandi che vi permettono di fare questo passaggio:
a e i: per inserire testo rispettivamente dopo e prima del cursore (A e I inseriscono il testo alla fine e all'inizio della riga attuale);
o e O: per inserire testo rispettivamente sotto e sopra la riga attuale.
In modalità inserimento vedrete comparire in fondo allo schermo la scritta --INSERT-- (in modo da sapere in che modalità vi trovate); potete inserire testo solo e unicamente in questa modalità. Per tornare in modalità comandi premete il tasto Esc.
In modalità inserimento potete usare i tasti Backspace e Canc per cancellare il testo durante la digitazione. Per spostarvi all'interno del testo, sia in modalità comandi che in modalità inserimento, potete usare i tasti cursore. In modalità comandi sono disponibili anche altre combinazioni di tasti di cui ci occuperemo in seguito.
Alla modalità ex si accede premendo il tasto : in modalità comandi: lo stesso carattere : comparirà in fondo allo schermo, e il cursore sarà posizionato su di esso; tutto ciò che scriverete in seguito, fino alla pressione di Invio, sarà considerato da Vi come un comando ex. Se cancellate il comando e il : sarete riportati in modalità comandi, e il cursore tornerà nella sua posizione originale.
Per salvare i cambiamenti effettuati in un file digitate :w in modalità comandi. Se volete salvare il contenuto del buffer in un file differente scrivete :w <nome_file>.
Come in Emacs, potete avere diversi buffer visualizzati sullo schermo; per ottenere questo risultato usate il comando :split.
Per spostarvi da un file all'altro, quando siete in un buffer, scrivete :next per andare al file successivo e :prev per andare al precedente. Potete anche usare il comando :e <nome_file>, che vi permette di spostarvi sul file desiderato, se esso è stato già aperto, o di aprire un nuovo file; anche in questo caso è disponibile il completamento automatico.
Per cambiare buffer, digitate Ctrl+w j per andare al buffer inferiore, o Ctrl+w k per andare a quello superiore; potete anche usare i tasti cursore su e giù invece di j e k. Il comando :close nasconde un buffer, mentre il comando :q lo chiude.
Fate attenzione, Vi è pignolo: se provate a nascondere o chiudere un buffer senza aver salvato i cambiamenti, il comando non sarà eseguito e comparirà questo messaggio:
Non salvato dopo modifica (usa ! per eseguire comunque) |
Oltre ai tasti Backspace e Canc in modalità inserimento, Vi ha molti altri comandi per cancellare, copiare, incollare e sostituire testo – in modalità comandi. In questa sede ci occuperemo di alcuni di essi. Tutti i comandi mostrati qui sono in realtà divisi in due parti: l'azione da compiere e l'area interessata. L'azione può essere:
c: sostituire (Change); l'editor cancella il testo indicato, e dopo questo comando torna in modalità inserimento;
d: cancellare (Delete);
y: copiare (Yank), ce ne occuperemo nella prossima sezione;
.: ripete l'ultima operazione.
L'area interessata indica su quali gruppi di caratteri deve agire il comando. Questi stessi comandi di area interessata immessi da soli, così come sono, in modalità comandi corrispondono a movimenti:
h, j, k, l: rispettivamente un carattere a sinistra, in giù, in su e a destra[1];
e, b, w: fino alla fine e fino all'inizio della parola attuale, fino all'inizio della parola successiva;
^, 0, $: fino al primo carattere non vuoto della riga attuale, fino all'inizio della riga attuale, fino alla fine della riga attuale;
f<x>: fino alla prossima occorrenza del carattere <x>; ad esempio, fe sposta il cursore sulla prossima occorrenza del carattere e;
/<stringa>, ?<stringa>: fino alla successiva occorrenza della stringa o espressione regolare <stringa>, e la stessa cosa a ritroso nel file; ad esempio, /pippo sposta il cursore fino alla prossima occorrenza della parola pippo;
{, }: fino all'inizio e fino alla fine del paragrafo attuale;
G, H: fino alla fine del file, fino all'inizio dello schermo.
Ciascuno di questi caratteri di area interessata o comandi di movimento può essere preceduto da un numero di ripetizioni; nel caso di G, invece, esso indica un numero di riga all'interno del file. Partendo da queste basi, potete creare qualsiasi combinazione.
Alcuni esempi:
6b: si sposta di 6 parole indietro;
c8fk: cancella tutto il testo fino alla ottava occorrenza del carattere k, quindi va in modalità inserimento;
91G: va alla linea 91 del file;
d3$: cancella fino alla fine della riga attuale, più le due righe successive.
Vi possiede un comando per copiare testo che abbiamo già incontrato: il comando y. Per tagliare il testo è sufficiente usare il comando d. Avete a disposizione 27 memorie per memorizzare il testo: una memoria anonima e 26 memorie denominate come le 26 lettere minuscole dell'alfabeto inglese.
Per usare la memoria anonima dovete digitare il comando semplice. Perciò il comando y12w copia nella memoria anonima le 12 parole che si trovano dopo il cursore[2]. Usate invece d12w se volete tagliare lo stesso blocco di testo.
Per utilizzare una delle 26 memorie associate alle lettere dell'alfabeto, digitate la sequenza "<x> prima del comando, dove <x> rappresenta il nome della memoria. Perciò dovreste scrivere "ky12w per copiare le stesse 12 parole nella memoria k, e "kd12w per tagliarle.
Per incollare il contenuto della memoria anonima dovete usare i comandi p o P (per Paste), per inserire il testo rispettivamente dopo o prima del cursore. Per incollare il contenuto di una memoria con un nome usate "<x>p o "<x>P nello stesso modo (ad esempio, "dp inserirà il contenuto della memoria d dopo il cursore).
Diamo un'occhiata all'esempio di Figura 3-5.
Per compiere questa operazione seguiremo questi passi:
copiamo le prime 6 parole della frase nella memoria r (per esempio): "ry6w [3];
andiamo nel buffer file2, che si trova sotto: Ctrl+w j;
incolliamo il contenuto della memoria r prima del cursore: "rp.
Otteniamo così il risultato che ci aspettavamo, come mostrato in Figura 3-6.
Cercare del testo è molto semplice: in modalità comandi è sufficiente digitare / seguito dalla stringa che deve essere cercata, e quindi premere il tasto Invio. Per esempio, con /party faremo una ricerca della stringa party a partire dalla posizione attuale del cursore. Premendo n venite portati all'occorrenza successiva, e se siete arrivati alla fine del file la ricerca ripartirà dall'inizio. Per cercare all'indietro usate ? invece di /.
Il comando per uscire è :q (in realtà questo comando chiude il buffer attuale, come abbiamo già visto, ma se questo è l'unico buffer esistente uscirete da Vi). Esiste una scorciatoia: nella maggior parte dei casi voi modificherete un solo file per volta. Quindi per uscire potrete usare:
:wq per salvare le modifiche e uscire (un metodo più veloce è ZZ), oppure
:q! per uscire senza salvare.
Avrete già notato che, se avete diversi buffer aperti, :wq salverà il buffer attivo per poi chiuderlo.
[1] | Una scorciatoia per dl (cancella un carattere in avanti) è x; una scorciatoia per dh è X; dd cancella la riga attuale. |
[2] | ...sempre se il cursore si trova all'inizio della prima parola! |
[3] | y6w significa letteralmente: " Yank 6 words ". |