Guida avanzata a Solaris

Capitolo 6 L'editor vi

vi (pronunciato "vi-ai") è l'editor di testo standard di SunOS. Poiché non richiede un'interfaccia a finestre, vi può essere utilizzato su qualsiasi tipo di terminale per creare o modificare vari tipi di file.

vi può essere utilizzato per inserire e modificare un testo, ma non può essere definito un vero e proprio word-processor. A differenza dei word-processor disponibili in commercio, infatti, vi non è stato creato per elaborare testi formattati. Per produrre stampe formattate vi si affida a programmi in grado di emulare un processo di composizione come nroff, troff o ditroff. Questi programmi consentono di formattare il testo di vi inserendo una serie di codici che vengono successivamente interpretati dall'emulatore.

La lunga serie dei comandi di vi, molti dei quali hanno funzioni simili, può creare qualche confusione nei nuovi utenti. In questo capitolo viene fornita una panoramica dei comandi fondamentali. Si scoprirà con l'uso che vi è un editor di testo estremamente potente, ma anche che per impiegarlo con efficacia è indispensabile una certa pratica.

Esiste anche una versione di vi di sola lettura, di nome view. Aprendo un file con view si possono usare gli stessi comandi di vi, ma non è possibile salvare le modifiche. Questo programma può essere utilizzato quando occorre leggere un file di vi senza rischiare di modificarlo accidentalmente.

Avvio di vi

Nei paragrafi seguenti verrà spiegato come avviare vi, inserire un testo in un file, salvare (scrivere) il file e uscire da vi. Per facilitare la comprensione delle operazioni descritte, la spiegazione è accompagnata da esempi pratici.

Creazione di un file

Avviare vi aprendo il file prova come mostrato in questo esempio:

$ vi prova

Se esiste già un file di nome prova, vi aprirà il file esistente; in caso contrario verrà creato un nuovo file. Nell'esempio qui descritto, prova è un nuovo file.

Compare la videata di modifica di vi:

Figura 6-1 La videata di modifica di vi

Graphic

Il cursore appare nell'angolo superiore sinistro dello schermo. Le righe vuote sono indicate da una tilde (~).

vi può essere avviato anche senza specificare il nome di un file, digitando semplicemente vi. Il file creato potrà essere denominato all'uscita da vi.

La riga di stato

L'ultima riga dello schermo, detta riga di stato, presenta il nome del file e il numero di righe e di caratteri che esso contiene. Quando si crea un nuovo file, come nell'esempio precedente, la riga di stato segnala che si tratta di un file nuovo.

Le due modalità di vi

vi dispone di due modalità operative: la modalità inserimento, utilizzata per inserire un testo in un file, e la modalità comando, usata per inserire comandi che eseguono specifiche funzioni. La modalità di default è la modalità comando.

Poiché vi non indica la modalità corrente, la distinzione tra modalità inserimento e modalità comando causa spesso una certa confusione tra i nuovi utenti dell'editor. Per evitare di incorrere in uno "stress da vi", sarà sufficiente avere chiari sin dall'inizio alcuni concetti fondamentali.

Quando si apre un file in vi, l'editor è sempre in modalità comando. Per poter inserire un testo occorre prima digitare uno dei comandi che abilitano la modalità di inserimento, ad esempio i ("insert"), per inserire il testo nella posizione corrente del cursore, oppure a ("append"), per inserire il testo dopo la posizione corrente del cursore. (Questi ed altri comandi di vi verranno trattati in modo più approfondito nel resto del capitolo.)

Per tornare alla modalità di comando è sufficiente premere Esc. Se non si è certi della modalità corrente di vi, è possibile premere Esc per entrare in modalità comando e avere così un punto di riferimento sicuro. Se si preme Esc quando vi si trova già in modalità comando, il sistema emette un segnale acustico e lo schermo lampeggia, ma non si produce alcun danno.

Modalità inserimento

Per inserire un testo nel file prova, digitare il comando di inserimento i. vi esce dalla modalità comando ed entra in modalità inserimento.

Inserire ora alcune righe di testo terminando ogni riga con un Return. Come si può osservare, i caratteri digitati appaiono a sinistra del cursore e spingono i caratteri già presenti verso destra. Per il momento, se si commettono errori di battitura tornare indietro con il tasto Backspace e digitare nuovamente la riga prima di premere Return. Più avanti verrà spiegato come modificare il testo inserito.

Dopo avere inserito alcune righe, premere Esc per tornare alla modalità comando. Il cursore si sposterà sull'ultimo carattere inserito. A questo punto è possibile inserire altri comandi di vi.

Se vi sembra rispondere in modo strano, verificare che il tasto "Caps Lock" non sia premuto; l'attivazione di questo tasto fa apparire tutto il testo inserito in lettere maiuscole. In alcuni sistemi il tasto F1 (di norma posizionato vicino al tasto Esc) ha la stessa funzione del tasto Caps Lock. Si faccia attenzione, in questi casi, a non premere erroneamente questo tasto al posto di Esc.


Nota -

Talvolta può essere necessario azzerare o ridisegnare lo schermo, ad esempio per eliminare un messaggio del sistema. Per ridisegnare lo schermo, entrare in modalità comando e premere Ctrl-L. L'effetto di questo comando è analogo a quello dell'opzione "Ridisegna schermo" di OpenWindows.


Modalità comando

Quando si apre un file, vi si trova sempre in modalità comando. In questa modalità è possibile inserire una serie di comandi associati ad altrettante funzioni. Quasi tutti i comandi di vi consistono in una o due lettere, talvolta accompagnate da un numero opzionale. Di norma esistono due versioni dello stesso comando, una a lettere maiuscole e l'altra a lettere minuscole, che eseguono funzioni diverse ma correlate. Ad esempio, digitando una a minuscola il testo viene inserito a destra del cursore, mentre digitando una A maiuscola il testo viene inserito alla fine della riga.

In genere vi esegue i comandi direttamente, senza bisogno di premere Return. Un'eccezione è rappresentata dai comandi che iniziano con i due punti (:). In alcune guide di vi questi comandi vengono classificati come una terza modalità operativa, detta modalità ultima riga. Digitando due punti in modalità comando, infatti, i due punti e i caratteri inseriti successivamente appaiono sull'ultima riga dello schermo. Nell'ambito di questa descrizione, tuttavia, tutti i comandi di vi verranno considerati inseriti in modalità comando.

I comandi preceduti dai due punti sono in realtà comandi di ex. vi ed ex sono due interfacce separate dello stesso programma di trattamento testi, ma mentre vi è un'interfaccia "a schermo", ex è un'interfaccia "a linee". Tutti i comandi di ex sono disponibili anche in vi. In particolare, premendo il tasto dei due punti si passa direttamente all'interfaccia "a linee" ex. Questa speciale modalità consente di eseguire molte operazioni sui file senza bisogno di uscire da vi. Per maggiori informazioni, vedere "Comandi di ex" in questo capitolo.

Termine di una sessione

Quando si modifica un file in vi, in un primo momento le modifiche non vengono apportate direttamente al file, bensì a una copia del file che vi crea in uno spazio di memoria temporaneo detto buffer. La copia permanente del file sul disco viene modificata solo al momento della scrittura (salvataggio) del contenuto del buffer.

Questa procedura presenta alcuni aspetti positivi e alcuni negativi. Da un lato permette di uscire da un file e abbandonare le modifiche effettuate durante una sessione lasciando intatta la copia sul disco. Dall'altro lato vi è il rischio di perdere il contenuto del buffer (non salvato) in caso di crash del sistema. (Gli utenti collegati a terminali remoti tramite linea telefonica sono particolarmente soggetti a questo tipo di interruzioni.)

Il metodo migliore consiste nel salvare il lavoro frequentemente, soprattutto quando vengono effettuate modifiche di una certa consistenza.


Avvertenza - Avvertenza -

vi permette di tenere aperte più copie di uno stesso file simultaneamente. Si consiglia tuttavia di limitare il più possibile l'uso di questa funzione, che potrebbe creare confusione tra le modifiche apportate al file corrente e quelle inserite in una sessione simultanea.


Salvataggio delle modifiche e uscita da vi

vi dispone di diversi comandi per il salvataggio del contenuto del buffer e l'uscita dall'editor. Questi comandi offrono la possibilità di salvare il file, salvare e uscire oppure uscire senza salvare.

Salvataggio

Per salvare il contenuto del buffer (cioè scrivere il contenuto del buffer nel file sul disco) digitare:

:w

seguito da Return.

Salvataggio e uscita

Per salvare e uscire dall'editor, digitare:

:wq

seguito da Return. Oppure, digitare ZZ.

Si noti che il comando ZZ non è preceduto dai due punti e non deve essere seguito da Return.

Uscita senza salvataggio

Se il file non è stato modificato e si desidera semplicemente uscire, digitare:

:q

seguito da Return. Se il file è stato modificato, vi non permetterà di uscire con :q. Verrà visualizzato il messaggio Le ultime modifiche non sono state salvate (:quit! per ignorare).

Se non si desidera salvare le modifiche, digitare:

:q!

seguito da Return.

Stampa di un file

Dopo avere chiuso il file da vi, è possibile stamparlo con il comando seguente:

$ lp nomefile

dove nomefile è il nome del file da stampare. Questo comando invia il file alla stampante di default. Il file viene stampato senza alcuna formattazione, riga per riga, esattamente nella forma in cui appare sullo schermo. Per maggiori informazioni sui comandi di stampa, vedere Capitolo 8.

Comandi base di vi

I paragrafi seguenti illustrano diverse categorie di comandi di vi, utilizzati tra l'altro per le seguenti operazioni:

Spostamento all'interno di un file

Nei paragrafi precedenti è stato spiegato come creare, salvare, stampare e chiudere un file di vi. A questo punto, avendo creato un file, è necessario comprendere i concetti essenziali per gli spostamenti al suo interno. Aprire il file di prova ed eseguire i comandi descritti qui di seguito.

Spostamento del cursore

All'avvio di vi, il cursore compare nell'angolo superiore sinistro dello schermo. Operando in modalità comando è possibile spostare il cursore tramite una serie di comandi da tastiera, associati caso per caso a determinate lettere, ai tasti freccia, al tasto Return, al tasto Back Space (o Canc) o alla barra spaziatrice.


Nota -

vi interpreta i comandi distinguendo tra maiuscole e minuscole; uno "stesso" comando scritto in lettere maiuscole e in lettere minuscole potrebbe perciò produrre effetti radicalmente diversi.


Spostamenti con i tasti freccia

Se la tastiera dispone dei tasti freccia, si provi ad utilizzarli per spostare il cursore. Questi tasti permettono di muovere liberamente il cursore in alto, in basso, a destra e a sinistra. Si noti tuttavia che il cursore può essere spostato solo all'interno di un testo o di spazi già esistenti.

Se si utilizza vi da un terminale remoto, è possibile che i tasti freccia non funzionino correttamente. I problemi di questo tipo dipendono in genere dall'emulatore del terminale. Se i tasti freccia non sono utilizzabili, sono disponibili le seguenti alternative:

Spostamento di parola in parola

Premere w ("word") per spostare il cursore di parola in parola verso destra.

Premere b ("back") per spostare il cursore di parola in parola verso sinistra.

Premere W o B per spostare il cursore alla parola successiva o precedente ignorando i segni di punteggiatura.

Premere e ("end") per spostare il cursore sull'ultimo carattere della parola corrente.

Spostamento all'inizio o alla fine della riga

Premere ^ per spostare il cursore all'inizio della riga corrente.

Premere $ per spostare il cursore alla fine della riga corrente.

Spostamento alla riga successiva

Premere il tasto Return per spostare il cursore all'inizio della riga successiva.

Spostamento a sinistra

Premere il tasto Back Space per spostare il cursore di un carattere verso sinistra.

Spostamento a destra

Premere la barra spaziatrice per spostare il cursore di un carattere verso destra.

Spostamento a inizio schermo

Premere H ("high") per spostare il cursore all'inizio dello schermo.

Spostamento a metà schermo

Premere M ("middle") per spostare il cursore a metà schermo.

Spostamento a fine schermo

Premere L ("low") per spostare il cursore al fondo dello schermo.

Spostamento di pagina in pagina e scorrimento

Se ci si sposta verso il basso quando il cursore si trova al fondo dello schermo, o verso l'alto quando il cursore si trova all'inizio dello schermo, il testo scorrerà rispettivamente verso l'alto o verso il basso. Questo metodo può essere utile per lo spostamento all'interno di un file breve, ma può risultare scomodo o lento in un file di grandi dimensioni.

Gli spostamenti all'interno di un file possono essere eseguiti di pagina in pagina, di videata in videata o di mezza videata alla volta. (Per provare questi comandi sul file prova, aggiungere nuove righe per ottenere un testo di lunghezza sufficiente.)

Si noti che esiste una differenza fondamentale tra spostamento di pagina in pagina e scorrimento. Lo scorrimento produce un avanzamento o un arretramento di una riga alla volta, come se il testo venisse visualizzato su un rullo continuo. Lo spostamento di pagina in pagina fa invece avanzare o arretrare il cursore di una videata alla volta. Sui sistemi veloci la differenza può essere trascurabile. Se viceversa si lavora su un terminale remoto o in altre situazioni in cui il sistema opera in modo più lento del normale, la differenza può essere determinante.

Spostamento di una videata in avanti

Per spostarsi di una videata in avanti (verso il basso), premere Ctrl-F. (Premere il tasto Control e contemporaneamente il tasto F.) Il cursore apparirà nell'angolo superiore sinistro della nuova videata.

Spostamento di mezza videata in avanti

Per spostarsi di mezza videata in avanti, premere Ctrl-D.

Spostamento di una videata all'indietro

Per spostarsi di una videata all'indietro (verso l'alto), premere Ctrl-B.

Spostamento di mezza videata all'indietro

Per spostarsi di mezza videata all'indietro, premere Ctrl-U.

Inserimento di un testo

Nei paragrafi seguenti verranno descritti i comandi fondamentali di vi per l'inserimento di un testo. Si noti che tutti questi comandi pongono vi in modalità inserimento e che, per utilizzarli, occorre trovarsi in modalità comando. Per verificare di trovarsi in modalità comando, premere Esc.

Aggiunta

Digitando una a (da append, aggiungere), il nuovo testo viene inserito a destra del cursore. Per provare il funzionamento del comando, posizionare il cursore all'interno di una riga, premere una a minuscola e inserire il nuovo testo. Al termine, premere Esc.

Digitando una A maiuscola, il testo viene aggiunto alla fine della riga. Per provare il funzionamento di questo comando, posizionare il cursore all'interno di una riga e digitare A. Il cursore si sposterà alla fine della riga. Inserire il nuovo testo. Al termine, premere Esc.

Inserimento

Digitando una i minuscola in modalità comando, il nuovo testo viene inserito a sinistra del cursore.

Digitando una I maiuscola, il testo viene inserito all'inizio della riga. (Il comando fa spostare automaticamente il cursore all'inizio della riga.) Per tornare in modalità comando dopo avere inserito il testo, premere Esc.

Creazione di una riga

vi dispone di comandi per creare nuove righe sopra o sotto la posizione corrente del cursore.

Digitare una o minuscola per creare una riga sotto la posizione corrente del cursore. Per provare il comando, digitare una o e inserire un testo. Il nuovo testo inserito può occupare anche diverse righe. Al termine, premere Esc.

Digitare una O maiuscola per creare una riga sopra la posizione corrente del cursore.

Modifica di un testo

La modifica di un testo comporta la sostituzione di caratteri esistenti con caratteri nuovi. vi dispone di molti comandi per eseguire questa operazione, a seconda delle esigenze e della portata delle modifiche.

Modifica di una parola

Per sostituire una parola, posizionare il cursore all'inizio della parola da sostituire. Digitare cw seguito dalla nuova parola. Per terminare, premere Esc.

Per modificare una parte di una parola, posizionare il cursore sulla parola, a destra della parte da conservare. Digitare cw, inserire la correzione e premere Esc.

Modifica di una riga

Per modificare una riga, posizionare il cursore in qualsiasi punto della riga e digitare cc. La riga scomparirà lasciando una riga vuota per il nuovo testo (che potrà avere qualsiasi lunghezza). Per terminare, premere Esc.

Modifica di parte di una riga

Per sostituire una parte di una riga, posizionare il cursore a destra della parte che si desidera conservare. Digitare C, inserire il nuovo testo e premere Esc. In questo modo viene modificata la parte di testo compresa tra la posizione corrente del cursore e la fine della riga.

Sostituzione di caratteri

Per sostituire il carattere in corrispondenza del cursore con uno o più caratteri, digitare una s seguita dal nuovo testo. Per tornare alla modalità comando, premere Esc.

Sostituzione di un singolo carattere

Questo comando permette di sostituire il carattere evidenziato dal cursore con un altro carattere. Posizionare il cursore sul carattere e digitare una r seguita da un solo carattere sostitutivo. Dopo la sostituzione, vi torna automaticamente alla modalità comando (senza bisogno di premere Esc).

Trasposizione di caratteri

vi dispone di un comando molto semplice per correggere i caratteri trasposti, ad esempio un "ter" digitato al posto di "tre". Per eseguire la correzione, posizionare il cursore sulla prima lettera da spostare (in questo caso la e), quindi digitare xp. La e e la r cambieranno di posto e vi tornerà automaticamente alla modalità comando.

Divisione o unione di righe

Per spezzare una riga senza modificarne il testo, portare il cursore su un carattere di spazio e digitare una r seguita da Return. Si noti che eseguendo questa operazione con il cursore posizionato su una lettera, la lettera evidenziata sarà sostituita dal carattere di ritorno a capo.

Per unire due righe, posizionare il cursore sulla riga superiore e digitare una J maiuscola. (Non è necessario premere Esc per terminare.)

Annullamento delle modifiche

Lavorando su un file di testo, capita spesso di effettuare una modifica e di accorgersi subito dopo di preferire la versione precedente. I comandi di annullamento di vi permettono di annullare gli effetti di un'operazione e di proseguire da quel punto.

Annullamento del comando precedente

Se si commette un errore o si cambia idea dopo avere eseguito una data operazione, è possibile annullare l'ultimo comando digitando immediatamente una u. (Non è necessario premere Esc per terminare.) Premendo u una seconda volta, vi annullerà il comando di annullamento.

Annullamento delle modifiche a una riga

Per annullare tutte le modifiche apportate a una riga, digitare una U maiuscola. Questo comando ha effetto solo se il cursore non è stato precedentemente spostato su un'altra riga. (Non è necessario premere Esc per terminare.)

Cancellazione di un testo

I comandi di vi descritti qui di seguito permettono di cancellare un carattere, una parola o una riga. Al termine di queste operazioni vi resta in modalità comando, perciò per inserire nuovo testo occorre prima entrare in modalità inserimento.

Cancellazione di un carattere

Per cancellare un carattere, posizionare il cursore sul carattere da cancellare e digitare x.

Il comando x cancella anche lo spazio occupato dal carattere -- se si cancella una lettera all'interno di una parola, le altre lettere si avvicinano senza lasciare spazi vuoti. Il comando x permette anche di cancellare spazi vuoti all'interno di una riga.

Per cancellare un carattere posto prima (a sinistra) del cursore, digitare una X maiuscola.

Cancellazione di una parola o di parte di una parola

Per cancellare una parola, posizionare il cursore sul suo carattere iniziale e digitare dw. La parola viene cancellata senza lasciare spazi vuoti.

Per cancellare una parte di una parola, portare il cursore a destra della parte che si desidera conservare, quindi digitare dw per cancellare il resto della parola.

Cancellazione di una riga

Per cancellare una riga, posizionare il cursore in qualsiasi punto della riga e digitare dd. La riga viene cancellata senza lasciare spazi vuoti.

Cancellazione di parte di una riga

È anche possibile cancellare solo una parte di una riga.

Per cancellare tutti i caratteri situati a destra del cursore, posizionare il cursore a destra della parte che si desidera conservare e digitare D.

Per cancellare tutti i caratteri situati a sinistra del cursore, posizionare il cursore a destra della parte che si desidera cancellare e digitare d0 (d-zero).

Cancellazione fino alla fine del file

Per cancellare tutto il testo compreso tra la riga corrente e la fine del file, digitare dG. Verrà cancellata anche la riga su cui è posizionato il cursore.

Cancellazione dall'inizio del file

Per cancellare tutto il testo compreso tra l'inizio del file e la riga corrente, digitare d1G. Verrà cancellata anche la riga su cui è posizionato il cursore.

Copia e spostamento di un testo -- yank, delete e put

Molti word-processor offrono comandi per "copiare e incollare" e "tagliare e incollare" parti di testo. Anche l'editor vi dispone di queste funzioni. Nel caso di vi, l'operazione "copia e incolla" viene eseguita con i comandi yank e put, mentre l'equivalente di "taglia e incolla" si ottiene con i comandi delete e put.

Per copiare o spostare piccoli blocchi di testo sono disponibili varie combinazioni dei comandi yank, delete e put.

Copia di righe

Per copiare una riga sono richiesti due comandi: yy o Y ("yank") e p ("put below", inserisci sotto) o P ("put above", inserisci sopra). Si osservi che Y produce lo stesso effetto di yy.

Per copiare una riga, posizionare il cursore in qualsiasi punto della riga e digitare yy. Portare ora il cursore sulla riga sopra il punto in cui si desidera inserire la riga copiata e digitare p. Una copia della riga copiata verrà inserita al di sotto del cursore.

Per inserire la riga copiata al di sopra del cursore, digitare P.

Il comando yy può essere utilizzato anche con un numero: per copiare 11 righe, ad esempio, è possibile digitare 11yy. vi copierà undici righe a partire da quella corrente, e visualizzerà al fondo dello schermo il messaggio: 11 righe memorizzate.

I comandi P o p possono anche essere usati subito dopo uno dei comandi di cancellazione descritti in precedenza. In questo caso, il testo cancellato verrà inserito rispettivamente al di sopra o al di sotto del cursore.


Avvertenza - Avvertenza -

Tra i comandi yank, delete e put usare solo comandi di spostamento del cursore. Se prima di inserire con put un testo tagliato o copiato si cancella o si copia un altro blocco di testo, la porzione tagliata o copiata in precedenza andrà perduta.


Spostamento di righe

Per lo spostamento di una o più righe di testo sono richiesti due comandi: dd ("delete") e p oppure P.

Per spostare una riga, posizionare il cursore in qualsiasi punto della riga e digitare dd. Per spostare più righe, far precedere il comando dal numero di righe su cui si desidera eseguire l'operazione. Per cancellare ad esempio 5 righe, digitare 5dd.

Portare quindi il cursore sulla riga al di sopra del punto in cui si desidera reinserire la riga cancellata e digitare p. Il testo viene inserito in una nuova riga al di sotto del cursore.

Per inserire la riga cancellata al di sopra del cursore, digitare P.

Uso di nomi per i buffer

Per inserire ripetutamente un gruppo di righe in più punti di un documento, può essere comodo copiare le righe di interesse in un buffer e assegnare a questo buffer un nome. Per eseguire questa operazione, far precedere il comando da eseguire da una virgoletta doppia (") e dal nome del buffer. Ad esempio, per copiare quattro righe in un buffer di nome a, digitare "a4yy. È possibile usare diversi buffer per uno stesso documento. Ad esempio, si può cancellare un testo da una data posizione ed aggiungerlo in diversi altri punti. Per cancellare 12 righe e inserirle in un buffer di nome b, digitare "b12dd.

Per inserire nel documento il testo contenuto nel buffer, far precedere il comando p o P da "n, dove n è il nome del buffer. Ad esempio, per inserire nel documento le righe salvate nel buffer b, digitare "bP.

Il contenuto di un buffer può essere sostituito con nuove righe di testo. I buffer creati durante una sessione restano in memoria fino all'uscita da vi.

L'uso dei buffer denominati permette di cancellare e copiare diversi blocchi di testo separatamente, senza sovrascrivere ad ogni operazione il contenuto del buffer principale.

Uso di contatori per la ripetizione dei comandi

Molti comandi di vi possono essere preceduti da un fattore di ripetizione, detto contatore -- un numero che precede il comando e indica per quante volte l'operazione deve essere ripetuta.

Molti dei comandi descritti nei paragrafi precedenti possono essere utilizzati con un contatore. Ad esempio, 3dd indica che il comando di cancellazione di una riga deve essere ripetuto per tre volte; il risultato sarà quindi la cancellazione di tre righe. Analogamente, 2dw cancellerà due parole, mentre 4x cancellerà quattro caratteri o spazi. I contatori possono essere abbinati anche ai comandi per lo spostamento del cursore, ad esempio 3w e 2Ctrl-F. Tutte queste funzioni diventeranno più chiare con l'uso pratico dei comandi di vi. Nel paragrafo "Sommario dei comandi principali di vi" alla fine di questo capitolo, i comandi che accettano l'uso di un contatore sono indicati con "[numero]" prima del nome del comando.

Digitando un punto (.), vi ripete il comando di modifica precedente. Se ad esempio è stata cancellata una riga con dd, è possibile portare il cursore su un'altra riga e cancellarla digitando semplicemente un punto.

Comandi di ex

I comandi di ex possono essere più comodi e precisi di yank, delete e put quando le operazioni riguardano blocchi di testo relativamente estesi. Anziché contare le righe sullo schermo e quindi spostarsi nel nuovo punto di inserimento, si indica a vi un ambito di righe da spostare o da copiare e quindi si specifica la riga che precede il punto di inserimento desiderato.

Abilitazione e disabilitazione dei numeri di riga

Per abilitare i numeri di riga, digitare :set nu e premere Return.

I numeri di riga compaiono sul lato sinistro dello schermo. Non compaiono tuttavia quando il file viene stampato.

 1 Ascoltami, i poeti laureati
 2 si muovono soltanto tra le piante
 3 dai nomi poco usati: bossi ligustri o acanti.
 4
 5 Io, per me, amo le strade che riescono agli erbosi
 6 fossi dove in pozzanghere
 7 mezzo seccate agguantano i ragazzi
 8 qualche sparuta anguilla:
 9 le viuzze che seguono i ciglioni,
10 discendono tra i ciuffi delle canne
11 e mettono negli orti, tra gli alberi dei limoni.
~
~
~
~
:set nu

Per disabilitare i numeri di riga, digitare :set nonu e premere Return.

Copia di righe

La sintassi base del comando di ex per la copia di un testo è la seguente:

:numeroriga,numeroriga co numeroriga

I primi due numeri (separati da una virgola) specificano l'ambito di righe da copiare. Il terzo numero indica la riga prima del punto di inserimento.

Ad esempio, per copiare le righe da 1 a 5 di prova e inserire la copia dopo la riga 12, digitare:

:1,5 co 12

e premere Return.

Per specificare gruppi di righe, usare le seguenti abbreviazioni:

Per copiare perciò "dalla riga corrente fino alla riga 5" e inserire il blocco copiato dopo la riga 12, il comando da digitare sarà il seguente:

:.,5 co 12

Per copiare "dalla riga 6 alla fine del file" e inserire il blocco copiato dopo la riga 2, il comando da digitare sarà:

:6,$ co 2

Spostamento di righe

La sintassi base del comando di spostamento di ex è simile a quella del comando di copia descritto in precedenza:

:numeroriga,numeroriga m numeroriga

Per specificare i gruppi di righe e i punti di inserimento si utilizzano le stesse convenzioni del comando di copia, compreso l'uso delle abbreviazioni . e $. L'unica differenza consiste nel fatto che il comando di spostamento cancella il blocco dalla posizione originaria e lo reinserisce nel punto designato.

Ad esempio, per spostare le righe 1-5 alla riga dopo la 12, digitare:

:1,5 m 12

e premere Return.

Cancellazione di righe

Per cancellare un gruppo di righe, la sintassi del comando è la seguente:

:numeroriga,numeroriga d

Ad esempio, per cancellare le righe 1-5, digitare:

:1,5 d

Ricerca e sostituzione con vi

vi offre diversi metodi per ricercare un punto specifico di un file usando una determinata stringa di caratteri. Dispone inoltre di una potente funzione di sostituzione globale.

Ricerca di una stringa di caratteri

Una stringa di caratteri è una qualsiasi sequenza di uno o più caratteri. Può comprendere lettere, numeri, segni di punteggiatura, caratteri speciali, spazi, tabulazioni o ritorni a capo. Una stringa può essere una parola intera o una parte di una parola.

Per ricercare una stringa di caratteri, digitare una barra (/) seguita dalla stringa desiderata e premere Return. vi posizionerà il cursore sulla ricorrenza successiva della stringa specificata. Ad esempio, per ricercare la stringa "meta", digitare /meta e quindi Return.

Digitare n per spostarsi alla ricorrenza successiva della stringa, o N per tornare alla ricorrenza precedente.

Per eseguire una ricerca all'indietro si utilizza il carattere ? al posto di /. Gli effetti di n e N per lo spostamento in avanti e all'indietro vengono invertiti.

I comandi di ricerca distinguono di norma tra maiuscole e minuscole: se la stringa impostata è "cina", nel processo di ricerca non verrà trovata la parola "Cina". Per fare in modo che vi ignori la differenza tra maiuscole e minuscole durante la ricerca, digitare :set ic. Per ripristinare l'impostazione di default, digitare :set noic.

Se vi trova la stringa ricercata, il cursore si ferma alla sua prima ricorrenza. Se la stringa non viene trovata, vi visualizza sull'ultima riga dello schermo il messaggio Stringa non trovata.

Alcuni caratteri speciali ( / & ! . ^ * $ \ ?) hanno un significato particolare per il comando di ricerca, e per essere utilizzati all'interno di una stringa di ricerca devono essere preceduti dal carattere di escape (\). Ad esempio, per ricercare la stringa "qualcosa?" digitare /qualcosa\? e premere Return.

Questi caratteri speciali possono essere utilizzati come comandi per la funzione di ricerca; per essere interpretati in modo letterale nella stringa da ricercare devono essere preceduti da una barra rovesciata. Per utilizzare in senso letterale una barra rovesciata, digitare \\.

Funzioni avanzate di ricerca

Per rendere i processi di ricerca più precisi, è possibile inserire nella stringa da ricercare speciali indicatori per le seguenti caratteristiche:

Per ricercare una stringa collocata all'inizio di una riga, far precedere la stringa da un accento circonflesso (^). Ad esempio, per ricercare la prima riga che inizia con "Ricerca", digitare:

/^Ricerca

Per ricercare una stringa collocata alla fine di una riga, digitare alla fine della stringa il simbolo del dollaro ($). Ad esempio, per ricercare la prima riga che termina con la stringa "ricerca.", digitare:

/ricerca\.$

(Si osservi che il punto è preceduto da una barra rovesciata.)

Per ricercare una stringa posta all'inizio di una parola, digitare \< all'inizio della stringa; per ricercare una stringa posta alla fine di una parola, digitare \> alla fine della stringa. Per ricercare una parola intera, combinare le opzioni di inizio-parola e fine-parola nel modello di ricerca. Ad esempio, per ricercare la ricorrenza successiva della parola "ricerca" anziché della stringa "ricerca", digitare:

/\<ricerca\>

Per ricercare un qualsiasi carattere in una data posizione, digitare un punto (.) nella posizione desiderata della stringa. Ad esempio, per ricercare la ricorrenza successiva di "formato" o "formati", digitare:

/format.

In questo caso, poiché la ricerca si riferisce a una stringa e non a una parola, potranno essere trovati anche termini come "disinformato" o "informatica".

Per ricercare caratteri alternativi in una stringa, indicare le alternative racchiuse tra parentesi quadre. Il modello di ricerca /[md]stringa troverà le stringhe che iniziano con m o con d. Specificando invece il modello di ricerca /[d-m]stringa, verranno trovate tutte le stringhe che iniziano con una qualsiasi lettera dalla d alla m.

Per cercare nessuna o più ricorrenze di un carattere, digitare un asterisco (*) dopo il carattere desiderato. Utilizzando in combinazione le parentesi quadre e l'asterisco è possibile ricercare specifici modelli alternativi. Ad esempio, per ricercare tutte le stringhe che iniziano con una lettera dalla a alla z e finiscono con "formato" e tutte le ricorrenze della stringa "formato", digitare:

/[a-z]*formato

Sostituzione di una stringa di caratteri

La procedura per la sostituzione di una stringa di testo è basata sulle procedure di ricerca descritte in precedenza. Tutti i caratteri speciali disponibili per la ricerca possono essere utilizzati anche per le operazioni di ricerca e sostituzione.

La sintassi base del comando è la seguente:

:g/stringa-di-ricerca/s//stringa-di-sostituzione/g

seguita da Return.

Per sostituire ad esempio tutte le ricorrenze della stringa "formato" con la stringa "dimensioni" digitare:

:g/formato/s//dimensioni/g

e premere Return.

Questo comando può essere modificato in modo che vi fermi la ricerca e chieda conferma della sostituzione ad ogni ricorrenza della stringa. Nel comando dell'esempio seguente, le opzioni gc specificano a vi di fermarsi ad ogni ricorrenza di "formato" e di chiedere conferma della sostituzione. Rispondere con y per sì o con n per no.

:g/formato/s//dimensioni/gc


Nota -

Per annullare una procedura di ricerca e sostituzione con richiesta di conferma, premere Ctrl-C.


Spostamento a una riga specifica

Per spostarsi sull'ultima riga del file corrente, digitare G. Per tornare alla prima riga, digitare 1G.

Per spostarsi su una qualsiasi altra riga specifica, digitare il numero della riga seguito da G.

Se ad esempio il file prova viene chiuso quando ci si trova alla riga 51, all'apertura successiva del file è possibile tornare direttamente a quella riga digitando 51G.

Inserimento di un file in un altro

vi permette di inserire un intero file all'interno del file corrente. La sintassi generale del comando è la seguente:

:numeroriga r nomefile

Se non viene specificato il numero di riga, vi inserisce il file nella posizione corrente del cursore.

Per inserire ad esempio il file montale alla riga 84 del file prova, il comando da digitare è il seguente:

:84 r montale

Oppure, è possibile posizionare il cursore alla riga 84 e digitare:

:r montale

Apertura contemporanea di più file

vi permette di tenere aperti più file contemporaneamente. Ad esempio, per aprire e modificare il file montale mentre è già aperto il file prova, procedere come segue:

  1. Salvare il lavoro corrente in prova. Digitare :w e premere Return.

  2. Aprire montale digitando :n montale, quindi premere Return.

  3. Apportare le modifiche desiderate a montale e salvare il file.

  4. Dopo avere modificato e salvato il file montale, sono disponibili tre alternative:

    • Uscire da vi. Digitare :q e premere Return.

    • Tornare a prova. Digitare :n # e premere Return.

    • Lavorare alternatamente sui due file utilizzando il comando :n #.

Apertura di più file

Per aprire una serie di file, digitare vi seguito dai nomi dei file desiderati al prompt di sistema:

$ vi prova montale

I file vengono aperti nell'ordine in cui sono stati elencati. Nel caso dell'esempio verrà visualizzato per primo il file prova. Al termine del lavoro su prova, digitare :n per passare al file successivo, montale. Per passare al file successivo senza salvare le modifiche al file corrente, digitare :n! anziché :n.

Se i file da aprire hanno nomi simili (ad esempio, test1, test2, test3), è possibile specificarne i nomi utilizzando i caratteri speciali:

$ vi test*

I file verranno visualizzati in ordine alfabetico.

Copia di righe tra più file

Per copiare un gruppo di righe da un file in un altro, procedere come segue:

  1. Aprire il primo file.

  2. Salvare le righe desiderate in un buffer usando il comando yank. Ad esempio, per salvare 10 righe nel buffer a, digitare a10Y.

  3. Senza uscire da vi, passare al file successivo (montale in questo esempio):

    :n montale
    

  4. Inserire le righe copiate dal primo file con il comando put. Ad esempio, per inserire i contenuto del buffer a al di sotto della posizione corrente del cursore, digitare ap.

    Si ricordi che il contenuto dei buffer denominati vengono cancellati all'uscita da vi. È consigliabile perciò terminare le operazioni che comportano l'uso dei buffer prima di digitare il comando di uscita (:q).

Impostazione dei parametri di vi

vi dispone di molte variabili che agiscono sul funzionamento e sul tipo di visualizzazione dell'editor. Per visualizzare l'elenco delle variabili (con le impostazioni correnti) durante l'utilizzo di vi, digitare:

:set all

seguito da Return.

Recupero di un file dopo un crash del sistema

Un crash del sistema può causare la perdita del contenuto dei buffer. Spesso, tuttavia, è possibile recuperare la maggior parte del lavoro riavviando vi con il comando:

vi -r nomefile

dove nomefile è il file che era aperto al momento del crash. Dopo il riavvio, il sistema visualizza un messaggio indicante la presenza di un file di recupero.

Sommario dei comandi principali di vi

La tabella seguente riassume i comandi principali di vi.

Tabella 6-1 Comandi principali di vi

Comando 

Effetto 

Avvio di vi

 

vi nomefile

Apre o crea un file 

vi

Apre un nuovo file senza nome 

vi -r nomefile

Recupera un file dopo un crash 

view nomefile

Apre un file in modalità di sola lettura 

Spostamento del cursore

 

h

Di un carattere a sinistra 

Alla riga successiva 

Alla riga precedente 

Di un carattere a destra 

Di una parola a destra 

Di una parola a destra (ignorando la punteggiatura) 

Di una parola a sinistra 

Di una parola a sinistra (ignorando la punteggiatura) 

Alla fine della parola corrente 

Return 

Alla riga successiva 

Back Space 

Di un carattere a sinistra 

Barra spaziatrice 

Di un carattere a destra 

H

All'inizio dello schermo 

M

A metà dello schermo 

L

Al fondo dello schermo 

Ctrl-F 

Di una videata in avanti 

Ctrl-D 

Di mezza videata in avanti 

Ctrl-B 

Di una videata all'indietro 

Ctrl-U 

Di mezza videata all'indietro 

Inserimento di caratteri e righe

a

Inserisce caratteri a destra del cursore 

A

Inserisce caratteri alla fine della riga 

i

Inserisce caratteri a sinistra del cursore 

I

Inserisce caratteri all'inizio della riga 

o

Inserisce una riga sotto il cursore 

O

Inserisce una riga sopra il cursore 

Modifica del testo

 

cw

Cambia la parola (o una sua parte) a destra del cursore 

c

Cambia l'intera riga 

C

Cambia dal cursore a fine riga 

s

Sostituisce i caratteri dal cursore in avanti 

r

Sostituisce il carattere sotto il cursore 

r Return

Spezza la riga 

J

Unisce la riga corrente a quella successiva 

xp

Inverte il carattere corrente con quello alla sua destra 

~

Cambia da maiuscolo a minuscolo (e viceversa)

u

Annulla il comando precedente 

U

Annulla tutte le modifiche alla riga corrente 

:u

Annulla l'ultimo comando di ex

Cancellazione del testo

 

x

Cancella il carattere sotto il cursore 

X

Cancella il carattere a sinistra del cursore 

dw

Cancella la parola (o la sua parte a destra del cursore) 

dd

Cancella la riga su cui si trova il cursore 

D

Cancella la parte della riga a destra del cursore 

dG

Cancella fino alla fine del file 

d1G

Cancella dall'inizio del file al cursore 

:5,10 d

Cancella le righe 5-10 

Copia e spostamento del testo

yy

Copia una riga 

Y

Copia una riga 

p

Inserisce la riga copiata o cancellata sotto quella corrente 

P

Inserisce la riga copiata o cancellata sopra quella corrente 

:1,2 co 3

Copia le righe 1-2 e le inserisce dopo la riga 3 

:4,5 m 6

Sposta le righe 4-5 dopo la riga 6 

Impostazione dei numeri di riga

:set nu

Mostra i numeri di riga 

:set nonu

Nasconde i numeri di riga 

Impostazione del riconoscimento di maiuscole e minuscole

:set ic

Ignora maiuscole e minuscole nella ricerca 

:set noic

Distingue tra maiuscole e minuscole nella ricerca 

Ricerca di una riga

 

G

Va all'ultima riga del file 

1G

Va alla prima riga del file 

21G

Va alla riga 21 

Ricerca e sostituzione

 

/stringa

Ricerca stringa

?stringa

Ricerca stringa all'indietro

n

Ricerca la ricorrenza successiva di stringa

N

Ricerca la ricorrenza precedente di stringa

:g/stringa-ricerca/s// stringa-sostituzione/g

Ricerca e sostituisce 

Controllo dello schermo

 

Ctrl-L 

Ridisegna lo schermo 

Inserimento di un file in un altro file

:r nomefile

Inserisce un file dopo il cursore 

:34 r nomefile

Inserisce un file dopo la riga 34 

Salvataggio e uscita

 

:w

Salva le modifiche (memorizza il contenuto del buffer) 

:w nomefile

Scrive il contenuto del buffer nel file specificato 

:wq

Salva le modifiche ed esce da vi 

ZZ

Salva le modifiche ed esce da vi 

:q!

Esce senza salvare le modifiche