next up previous contents index
Next: The GNU General Public Up: Introduzione a Vi Previous: Breve manuale di Vi

Manuale avanzato di vi

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.

Spostarsi nel testo

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.tex
Questo 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?

Modificare il testo

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 salvataggio
vi 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.

Copiare e spostare delle sezioni di testo

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:

  1. Yanking (copia) del testo in un buffer.
  2. Moving (spostamento) del cursore alla posizione destinata
  3. Pasting (incollamento) del testo nel buffer di modifica.

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:

  1. Cancellare il testo spostandolo in un buffer con o senza nome.
  2. Spostare il cursore al punto in cui si vuole spostare il testo.
  3. Incollare il buffer.

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").

Cercare e sostituire del testo

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.

 


next up previous contents index
Next: The GNU General Public Up: Introduzione a Vi Previous: Breve manuale di Vi


Fri Sep 19 00:41:53 CEST 1997