Il vantaggio e la potenza di vi sono nella possibilità di usarlo con successo conoscendo solo un piccolo sottoinsieme dei comandi. La maggior parte degli utenti di vi si sentono un po' strani all'inizio, ma dopo poco tempo sentono il bisogno di conoscerlo meglio.
Il manuale che segue assume che l'utente abbia finito il manuale breve (qui sopra) e si senta a proprio agio con vi; mostrerà alcune delle caratteristiche più potenti di ex/vi, dalla copia del testo alle definizioni delle macro; c'è una sezione su ex e le sue impostazioni, che aiuta a personalizzare l'editor. Questo manuale descrive i comandi, piuttosto che portarvi a conoscerli insieme per insieme. È preferibile che spendiate del tempo a provarli su un testo di esempio, che possiate distruggere.
Questo manuale non descrive tutti i comandi di vi anche se sono coperti tutti quelli usati più comunemente. Anche se scegliete di usarlo come editor alternativo, si spera che apprezziate vi e quello che offre a chi lo sceglie.
La funzione più semplice di un editor è di spostare il cursore nel testo. Ecco alcuni altri comandi di spostamento:
h sposta il cursore uno spazio a destra j sposta il cursore una linea in basso k sposta il cursore una linea in alto l sposta il cursore una linea a destra Alcune implementazioni permettono anche di spostare il cursore con i tasti freccia. w sposta all'inizio della parola seguente e sposta alla fine della parola seguente E sposta alla fine della parola seguente prima di uno spazio b sposta all'inizio della parola precedente 0 sposta all'inizio della linea ^ sposta alla prima parola della linea corrente $ sposta alla fine della linea <CR> sposta all'inizio della linea seguente - sposta all'inizio della linea precedente G sposta alla fine del file 1G sposta all'inizio del file nG sposta alla linea numero n <Cntl> G mostra il numero di linea corrente % alla parentesi corrispondente H alla prima linea della schermata M alla linea centrale della schermata L all'ultima linea della schermata n| sposta il cursore alla colonna n
Lo schermo scorrerà automaticamente quando il cursore raggiunge o la cima o il fondo della schermata. Ci sono dei comandi alternativi che possono controllare lo scorrimento dello schermo:
<Cntl> f scorre una schermata avanti <Cntl> b scorre una schermata indietro <Cntl> d scorre mezza schermata avanti <Cntl> u scorre mezza schermata indietro
I comandi riportati qui sopra controllano lo spostamento del cursore. Alcuni di questi comandi accettano un modificatore nella forma di un numero che precede il comando, che di solito ripeterà il comando stesso quel numero di volte.
Per spostare il cursore un numero di posizioni a sinistra:
nl sposta il cursore n posizioni a sinistra
Se voleste inserire n spazi prima di una parte di testo, potreste usare il modificatore di comando per il comando di inserimento: digitate il numero di volte che volete ripetere l'inserimento, poi premete .
ni inserisce del testo e lo ripete n volte
I comandi che riguardano le linee usano il modificatore per riferirsi al numero di linee: un buon esempio è il comando .
1G sposta il cursore alla prima linea
vi ha un gran numero di comandi che possono essere usati per spostare il cursore all'interno del file, da spostamenti di un carattere singolo a spostamenti diretti del cursore su una linea. vi può anche posizionare il cursore ad una linea scelta da linea di comando.
vi +10 mio.texQuesto comando apre il file mio.tex e posiziona il cursore a 10 linee dall'inizio del file.
Provate alcuni dei comandi di questa sezione. Pochissime persone se li ricordano tutti insieme; la maggior parte ne usano solo un piccolo sottoinsieme.
Bene. Ora vi potete spostare nel testo: come fate a modificarlo?
Lo scopo è di cambiare il contenuto del file, e vi offre un vastissimo insieme di comandi per aiutare a farlo.
Questa sezione focalizzerà l'attenzione su come aggiungere testo, modificare quello esistente, e cancellarlo. Alla fine di questa sezione avrete le conoscenze necessarie per creare qualsiasi file di testo. Le sezioni restanti trattano di comandi più comodi da digitare.
Quando si inserisce del testo, si possono inserire delle linee multiple usando il tasto . Se bisogna correggere un errore di battitura e siete sulla linea in questione in modalità inserimento, potete usare il tasto per spostare il cursore nel testo. Le diverse versioni di vi si comportano in maniera diversa; alcune spostano semplicemente il cursore indietro e il testo può essere ancora visualizzato ed accettato, altre rimuoveranno il testo a mano a mano che tornate indietro, alcuni cloni permettono addirittura di spostare il cursore dalla modalità inserimento con i tasti freccia; non è il comportamento standard di vi. Se il testo è visibile e usate il tasto quando siete sulla linea in cui avete cancellato il testo con , il testo dopo il cursore viene cancellato. Usate la vostra versione dell'editor per abituarvici.
a Aggiunge del testo dopo la posizione corrente del cursore A Aggiunge del testo alla fine della linea i Inserisce del testo a sinistra del cursore I Inserisce del testo a sinistra del primo carattere non vuoto della linea corrente o Apre una nuova linea ed inserisce il testo sotto la linea corrente O Apre una nuova linea ed inserisce il testo sopra la linea corrente
vi ha un piccolo insieme di comandi di cancellazione che possono essere migliorati con l'uso dei modificatori.
x Cancella un carattere da sotto il cursore dw Cancella dalla posizione corrente alla fine della parola dd Cancella la linea corrente D Cancella dalla posizione corrente alla fine della linea
I modificatori possono essere usati per aggiungere potere ai comandi. Gli esempi qui sotto sono solo alcune delle possibilità fornite.
nx Cancella n caratteri da sotto il cursore ndd Cancella n linee dnw Cancella n parole (equivalente a ndw) dG Cancella dalla posizione corrente alla fine del file d1G Cancella dalla posizione corrente all'inizio del file d$ Cancella dalla posizione corrente alla fine della linea (Lo stesso di D) dn$ Cancella dalla linea corrente alla fine dell'n-esima linea
L'elenco di comandi qui sopra mostra che l'operazione di cancellazione è molto potente. Questo diventa evidente quando viene applicata in combinazione con i comandi di spostamento del cursore. Un comando da annotare è , dato che ignora le direttive dei modificatori.
In determinate occasioni potreste voler disfare i cambiamenti fatti. I seguenti comandi riportano il testo alla situazione precedente ai cambiamenti:
u Annulla l'ultimo comando U Annulla tutti i cambiamenti fatti sulla linea corrente :e! Riporta allo stato dell'ultimo salvataggiovi non vi permette solo di annullare i cambiamenti, ma annulla gli annullamenti. Usando il comando cancellate 5 linee, poi riportatele con il comando . Le modifiche possono essere rieseguite con un altro comando .
vi offre dei comandi che permettono di fare delle modifiche al testo senza dover prima cancellare e poi ridigitare la nuova versione:
rc Sostituisce il carattere sotto il cursore con c Sposta il cursore a destra se viene ripetuto con un modificatore, come in 2rc) R Sovrascrive il testo con il nuovo testo cw Modifica la parola corrente c$ Modifica il testo dalla posizione corrente alla fine della linea cnw Modifica le prossime n parole (lo stesso di ncw). cn$ Modifica fino alla fine dell'n-esima linea C Modifica fino alla fine della linea (lo stesso di c$) cc Modifica la linea corrente s Sostituisce il testo che digitate al posto del carattere corrente ns Sostituisce il testo che digitate al posto dei seguenti n caratteri
Dai comandi di modifica che permettono di dare una stringa di caratteri si esce con il tasto .
Il comando parte dalla posizione corrente nella parola alla fine della parola stessa; quando si usa un comando di modifica che specifica una distanza verrà applicato il cambiamento: vi metterà un $ come ultimo carattere. Il nuovo testo può essere più lungo o più breve del testo originale.
Spostare del testo coinvolge un buon numero di comandi, che vengono combinati per raggiungere il risultato finale. Questa sezione introdurrà dei buffer con e senza nome insieme ai comandi che tagliano ed incollano il testo.
Copiare del testo implica tre passi principali:
Per copiare del testo nel buffer senzanome usate il comando .
yy Sposta una copia della linea corrente al buffer senzanome. Y Sposta una copia della linea corrente al buffer senzanome nyy Sposta le n linee successive nel buffer senzanome. nY Sposta le n linee successive nel buffer senzanome. yw Sposta una parola nel buffer senzanome. ynw Sposta n parole nel buffer senzanome. nyw Sposta n parole nel buffer senzanome. y$ Sposta la posizione corrente alla fine della linea.
Il buffer senzanome è un buffer temporaneo che viene corrotto facilmente da altri comandi comuni. In determinate occasioni il testo può essere necessario per un lungo periodo di tempo; in questo caso viene usato un buffer con nome. vi ha 26 buffer con nome, che si identificano con le lettere dell'alfabeto. Per distinguere tra un comando e il nome di un buffer, vi usa il carattere . Quando si usa un buffer con nome con la lettera minuscola, il contenuto viene sostituito, mentre se si usa la lettera maiuscola, il contenuto viene aggiunto a quello già presente nel buffer.
"ayy Sposta la linea corrente nel buffer a. "aY Sposta la linea corrente nel buffer a. "byw Sposta la parola corrente nel buffer b. "Byw Aggiungi la parola corrente al contenuto del buffer b. "by3w Sposta le prossime 3 parole nel buffer b.
Usate il comando per incollare il contenuto del buffer tagliato nel buffer di modifica.
p Incolla dal buffer senzanome a DESTRA del cursore P Incolla dal buffer senzanome a SINISTRA del cursore nP Incolla n copie del buffer senzanome a SINISTRA del cursore "ap Incolla dal buffer a a DESTRA del cursore "b3P Incolla 3 copie del buffer b a SINISTRA del cursore
Quando state usando vi dall'interno di un xterm, avete una o più opzioni per copiare del testo. Selezionate la sezione di testo che volete copiare trascinando con il mouse sopra il testo. Tenere premuto il pulsante sinistro del mouse e trascinare dall'inizio alla fine del testo invertirà il colore del testo stesso; questo piazza automaticamente il testo in un buffer riservato dal server X. Per incollare il testo premete il pulsante centrale del mouse. Ricordatevi di mettere vi in modalità inserimento, dato che l'input potrebbe essere interpretato come comandi e il risultato è ignoto. Usando la stessa tecnica potete copiare una parola singola cliccando due volte sulla parola con il pulsante sinistro del mouse. Solo la parola verrà copiata. Per incollare la procedura è la stessa di prima. Il contenuto del buffer cambierà solamente quando viene evidenziata una nuova area.
Per spostare del testo bisogna fare tre passi:
Il processo è lo stesso che per copiare, con il cambiamento nel primo passo, in cui si deve cancellare il testo. Quando si usa il comando la linea viene cancellata e messa all'interno del buffer senzanome. Potete incollarne il contenuto come quando avete copiato il testo nella posizione desiderata.
"add Cancella la linea e la mette nel buffer a. "a4dd Cancella 4 linee e le mette nel buffer a. dw Cancella una parola e la mette nel buffer senzanome.Vedere la sezione sulla modifica del testo per altri esempi su come cancellare del testo.
Quando il sistema crasha il contenuto dei buffer con e senza nome viene perso, ma il contenuto del buffer di modifica può essere recuperato (vedere "Comandi utili").
vi ha molti comandi di ricerca; potete cercare dei singoli caratteri, e anche espressioni regolari.
I due comandi principali di ricerca di caratteri sono e .
fc Trova il carattere c successivo. Si sposta a DESTRA verso il prossimo. Fc Trova il carattere c successivo. Si sposta a SINISTRA verso il precedente. tc Si sposta a DESTRA al carattere prima del prossimo c. Tc Si sposta a SINISTRA al carattere seguente il c precedente. (In alcuni cloni è lo stesso di Fc) ; Ripete gli ultimi comandi f,F,t,T , Lo stesso di ; ma inverte la direzione del comando originale.
Se non trovate il carattere che stavate cercando, vi suonerà o vi darà un qualche altro segnale.
vi vi permette di cercare una stringa nel buffer di modifica:
/str Cerca a destra ed in basso il successivo evento di str. ?str Cerca a sinistra ed in alto il successivo evento di str. n Ripete l'ultimo comando / o ? N Ripete l'ultimo comando / o ? in direzione inversa
Quando si usano i comandi o viene liberata una linea in fondo allo schermo, dove si inserisce la stringa di ricerca seguita da .
La stringa nel comando o può essere un'espressione regolare, cioè una descrizione di un insieme di caratteri, che viene costruita usando del testo intermezzato con dei caratteri speciali: . * [] ^$.
. Fa corrispondere un qualsiasi singolo carattere tranne la newline. \ Considera i caratteri speciali come normali. * Fa corrispondere 0 o più eventi del carattere precedente. [] Fa corrispondere esattamente uno dei caratteri tra parentesi. ^ La corrispondenza del carattere seguente deve essere all'inizio della linea. $ Fa corrispondere i caratteri precedenti alla fine della linea. [^] Fa corrispondere tutti i caratteri non inclusi dopo il carattere di negazione. [-] Fa corrispondere un insieme di caratteri.
L'unico modo per capire bene le espressioni regolari è usarle. Qui sotto ci sono una serie di esempi:
c.pe Fa corrispondere cope, cape, caper ecc c\.pe Fa corrispondere c.pe, c.per ecc sto*p Fa corrispondere stp, stop, stoop ecc car.*n Fa corrispondere carton, cartoon, carmen ecc xyz.* Fa corrispondere xyz alla fine della linea ^The Fa corrispondere qualsiasi linea che cominci con The atime$ Fa corrispondere qualsiasi linea che finisca con atime ^Only$ Fa corrispondere qualsiasi linea che contenga solo la parola Only b[aou]rn Fa corrispondere barn, born, burn. Ver[D-F] Fa corrispondere VerD, VerE, VerF. Ver[^1-9] Fa corrispondere Ver seguito da un carattere che non sia un numero the[ir][re] Fa corrispondere their,therr, there, theie. [A-Za-z][A-Za-z]* Fa corrispondere qualsiasi parola.
vi usa la modalità comandi di ex per fare le operazioni di ricerca e di sostituzione. Tutti i comandi che cominciano con un due punti sono richieste in modalità ex.
I comandi di ricerca e sostituzione permettono di usare le espressioni regolari su un intervallo di linee e sostituire la stringa corrispondente. L'utente può chiedere conferma prima di attuare la sostituzione. Vale la pena di riguardare come ed rappresenta i numeri di linea.
:<inizio>,<fine>s/<trova>/<sostituisci>/g Comando generale :1,$s/the/The/g Cerca nell'intero file e sostituisci the con The. :%s/the/The/g % sta per l'intero file (come sopra) :.,5s/^.*//g Cancella il contenuto dalla linea corrente alla linea 5. :%s/the/The/gc Sostituisci the con The ma chiedi conferma prima di fare la sostituizione. :%s/^....//g Cancella i primi quattro caratteri di ciascuna linea.
Il comando di ricerca è molto potente se usato in combinazione con le stringhe di ricerca con le espressioni regolari. Se non si mette la direttiva il cambiamento viene fatto solo sulla prima corrispondenza di ciascuna linea.
Talvolta potreste voler usare la stringa di ricerca originale nel risultato delle sostituzioni. Si può digitare di nuovo il comando sulla linea, ma vi permette di inserire nella stringa di sostituzione alcuni caratteri speciali:
:1,5s/help/&ing/g sostituisce help con helping nelle prime 5 linee :%s/ */&&/g Raddoppia il numero degli spazi tra le parole.
Usare le stringhe di corrispondenza complete ha i suoi limiti, quindi vi usa le parentesi di escape e per scegliere l'intervallo di sostituzione. La sostituzione può essere costruita usando il tasto con l'escape , che identifica l'intervallo nell'ordine della definizione.
:s/^\(.*\):.*/\1/g Cancella tutto ciò che è prima dei due punti, compresi i due punti stessi. :s/\(.*\):\(.*\)/\2:\1/g Inverte le parole ai due lati dei due punti.
Molto probabilmente rileggerete queste ultime perle. vi offre dei comandi molto potenti, che moltissimi editor moderni non hanno; il prezzo da pagare è anche l'argomento più usato contro vi: i comandi possono essere difficili da imparare e da leggere. Anche se la maggior parte delle cose possono apparire un po' strane all'inizio, con un po' di esercizio alla volta l'insieme di comandi di vi diventerà per voi una seconda lingua.