Note relative all'editor VI

Vi (letto "vi-ai") è un editor di testo tradizionalmente considerato poco amichevole. La difficoltà principale nell'utilizzare tale strumento sta nel fatto che esso ha non una modalità d'uso (come la maggior parte degli editor) bensì due: una modalità comandi ed una modalità inserzione testo. La modalità inserzione testo consente esclusivamente di modificare il documento aperto aggiungendo del contenuto; la modalità comandi consente di eseguire tutte le altre operazioni, come ad esempio spostarsi all'interno del documento, modificare del testo, eseguire ricerche o cancellazioni, salvare il file, uscire dall'editor. I comandi sono costituiti da tasti (o combinazioni di tasti), quindi a seconda che ci troviamo in modalità testo oppure in modalità comandi la pressione di lettere, numeri o altri caratteri sulla tastierà avrà effetti differenti.

I motivi di questa scelta ricadono nel fatto che il target di utilizzatori per cui vi è stato realizzato sono i programmatori o, in generale tutte le persone che fanno ampio uso della tastiera e non hanno necessariamente bisogno di un supporto grafico. La tastiera è l'unico device necessario per l'uso di vi. Alcune versioni (come ad esempio gvi) combinano la presenza dei comandi tradizionali (via tastiera) con la presenza di menù che forniscono alcuni degli stessi comandi di uso più frequente.

Vediamo come si usa vi con un piccolo esempio: vogliamo creare un file prova.txt ed inserirvi la parola prova.

  1. da prompt digiteremo il comando vi prova.txt, se il file prova.txt esiste già nella working directory, il file esistente verrà aperto altrimenti l'editor aprirà un nuovo file con il nome specificato. Si noti che il file non sarà creato veramente se non al primo salvataggio.
  2. a questo punto ci troveremo in una finestra di editing (di solito la stessa finestra in cui è stato lanciato il comando vi), in modalità comandi.
  3. Per inserire del testo occorre passare in modalità testo, cosa che è possibile fare utilizzando una delle vocali i, a oppure o. I diversi effetti di questi tre comandi risulteranno più chiari quando il file avrà un contenuto non vuoto.
  4. quando si è in modalità testo, qualunque lettera, numero o altro carattere venga digitato, questo verrà inserito nel documento in preparazione. A questo punto posso quindi scrivere la parola prova.
  5. Supponiamo che mi sia sbagliata ed abbia scritto proba: posso utilizzare il tasto Backspace per spostarmi indietro sulla linea cancellando i caratteri uno per uno e quindi riscrivere in modo corretto il testo di interesse.
  6. Terminato di inserire il testo non ci rimane che salvare il file. Per fare questo occorre essere in modalità comandi. Per passare in modalità comandi si utilizza il tasto ESC (escape).
  7. Essendo in modalità comandi posso richiedere il salvataggio del file (comando :w) e l'uscita dall'editor (comando :q). Posso anche combinare i due comandi in uno solo (:wq) causando siail salvataggio del file sia l'uscita dall'editor. Si noti che quando si digita il simbolo : (due punti) compare in fondo alla pagina una linea di comando, all'interno della quale viene inserito il comando da eseguire. Sulla linea di comando possono essere scritti comandi articolati, con argomenti e sono terminati da un RETURN. Per esempio posso creare una copia del file corrente chiedendo al sistema di eseguire :w nomeNuovoFile . nomeNuovoFile sarà l'argomento di w.
  8. Se voglio uscire dall'editor senza salvare devo utilizzare :q! Il punto esclamativo forza l'esecuzione di un comando.

Vediamo ora più nello specifico come si fa ad eseguire tutto un insieme di operazioni utili (spostarsi in un punto del file, cercare una stringa, sostituirla con un'altra, modificare parole o parti di testo, copiare porzioni di testo, cancellarle, ecc.)

SPOSTARSI IN UN PUNTO DEL FILE
Tradizionalmente i movimenti più semplici (spostati di un carattere a sinistra, di un carattere a destra, una linea in su, una linea in giù) sono eseguiti utilizzando i caratteri h, l, k, j. h movimento verso sinistra, l verso destra, k verso l'alto, j verso il basso. Oltre a questi quattro comandi alcune versioni di vi (ma non tutte) sono in grado di gestire i quattro tasti cursori (quelli con le freccette) presenti sulla maggior parte delle tastiere. Quando si è fatta pratica dei movimenti di base, si può cominciare ad utilizzare comandi di spostamento che fanno fare balzi un po' più lunghi. Eccono alcuni:

  • parole: una parola è un insieme di caratteri contigui diversi da spazio (blank) e da newline (che fungono da separatori). Inoltre se ho una sequenza di alfanumici contigua a una sequenza di non alfanumerici, vi interpreta le due sottostringhe come parole separate. Quindi, per esempio la sequenza if (x>125) per vi è costituita da 6 parole distinte: if, (, x, >, 125, ). In vi è possibile spostarsi avanti e indietro per parole. Per spostarmi alla prossima parola devo utilizzare il comando w (in testa alla parola successiva) oppure e (alla fine della parola successiva) , per spostarmi indietro utilizzo b. Se voglio spostarmi di una parola contenente caratteri misti (alfanumerici e non) considerandola una parola sola, utilizzo le maiuscole W e B.
  • linea corrente: con $ ci si sposta alla fine della linea corrente, con ^ oppure con _ in testa alla linea corrente.
  • linea: posso spostarmi ad una linea specifica del documento utilizzando il comando :n dove n è il numero della linea di interesse (per esempio :123 sposta il cursore alla linea numero 123). Per visualizzare i numeri di linea (far precedere ogni linea dal numero corrispondente) posso utilizzare il comando :set nu. Per disabilitare la visualizzazione dei numeri di linea :set nonu.
  • pagina: CTRL-F (forward) fa scorrere il testo una pagina in avanti, CTRL-B (backward) una pagina indietro, CTRL-D (down) una mezza pagina in avanti, CTRL-U (up) mezza pagina indietro. Per spostare il cursore sulla prima linea della pagina corrente si usa H (head) mentre per spostarlo all'ultima linea della pagina corrente si usa L (last). Per spostare il cursore all'ultima linea del documento si usa G. Attenzione che con CTRL-G vengono invece visualizzate informazioni relative al documento (nome, dimensione, linea a cui ci troviamo, numero complessivo di linee, ...)

CANCELLAZIONE
In vi è possibile cancellare caratteri, parole, linee, tutto il documento. Vediamo come:

  • caratteri: utilizzando x cancello il carattere su cui è posizionato il cursore, con X cancello il carattere precedente a quello su cui è posizionato il cursore. Se digito 5x cancello 5 caratteri, se digito 10x ne cancello 10, in generale digitando nx, dove n è un numero, cancello i successivi n caratteri.
  • parole: con dw cancello la parola (di soli alfanumerici o soli caratteri non alfanumerici) che inizia con il carattere su cui è posizionato il cursore. Il comando dW ha un funzionamento analogo ma cancella tutti i caratteri dal cursore fino al successivo spazio o newline. Analogamente al caso precedente digitando 3dw cancellerò tre parole.
  • linee: il comando per cancellare la linea su cui è posizionato il cursore è dd. Per cancellare n linee a partire da quella su cui è posizionato il cursore si usa ndd.
  • linee da N a M: per cancellare le linee dalla numero N alla numero M si utilizza il comando :N,Md
  • per cancellare il documento dalla linea corrente fino alla fine si utilizza dG.

RICERCA
Per cercare una stringa all'interno del documento si utilizzano:

  • /stringa (slash seguito dalla stringa da cercare, senza spazi bianchi nel mezzo) esegue la ricerca in avanti. Trovata la prima occorrenza della stringa, se si desidera ripeterela ricerca basta digitare n (next).
  • ?stringa (punto interrogativo seguito dalla stringa da cercare) esegue la ricerca all'indietro. Anche in questo caso le occorrenze della stringa successive alla prima possono essere trovate utilizzando il comando n.

SOSTITUZIONE
Supponiamo di voler eseguire delle sostituzioni di testo all'interno del documento, possiamo procedere in uno dei seguenti modi:

  • parole: il comando cw (e il comando cW per parole costituite da alfanumerici e non) causano la cancellazione della parola avente inizio nel carattere su cui si trova posizionato il cursore e l'attivazione della modalità testo permanendo nella medesima posizione. In altri termini l'utente ha la possibilità di inserire del testo che si sostituirà alla parola eliminata. Per tornare in modalità comandi al termine della modifica occorre utilizzare ESC. Come in altri casi precedenti posso sostituire n parole a partire da quella corrente con altro testo utilizzando ncw (o ncW), dove n è un nuomero intero (per esempio 3cW causa la sostituzione di 3 parole consecutive).
  • fino a fine linea: C causa l'eliminazione del resto della linea (dalla posizione corrente del cursore fino al newline) con passaggio a modalità testo.
  • ricerca e sostituzione: è possibile combinare un comando di ricerca con uno di sostituzione:
    • :N,Ms/vecchiaStringa/nuovaStringa in tutte le linee che vanno dalla numero N alla numero M sostituisce la prima occorrenza di vecchiaStringa con nuovaStringa. M può anche assumere il valore speciale $ (ultima riga) e all'interno della specifica della stringa da cercare possono comparire i simboli di inizio linea (^) e di fine linea($ anche in questo caso). Esempi:
      • :10,34s/proc/defun in tutte le linee dalla numero 10 alla numero 34 sostituisce la prima occorrenza di proc con defun.
      • :1,$s/;$/ caso particolare: se lascio vuota nuovaStringa causo la sostituzione di vecchiaStringa con una stringa vuota, quindi in pratica ne causo la cancellazione. Nell'esempio cancello tutti i punti e virgola che compaiono in fondo (;$) ad una qualsiasi linea del file (1,$ indica tutte le linee dalla prima all'ultima)
      • :1,$s/^M/ esempio utile: i file editati in ambiente Windows hanno dei caratteri di fine linea che comprendono il carattere ^M (CNTL-M) seguito dal carattere interpretato come newline in Unix. Per questo motivo quando si edita un file creato/modificato in ambiente Windows con vi, gli a-capo sono preceduti da fastidiosi ^M. Per eliminarli si può utilizzare il comando descritto. Per scrivere ^M occorre digitare la sequenza: CNTL-V CNTL-M.
    • :N,Ms/vecchiaStringa/nuovaStringa/g l'aggiunta di g causa una sostituzione globale, ovvero mentre nel caso precedente solo la prima occorrenza per linea di vecchiaStringa veniva modificata, in questo caso tutte le occorrenze di vecchiaStringa delle linee specificate verranno modificate.

COPY e PASTE
Per eseguire dei copy and paste di linee è possibile procedere nel seguente modo:

  • yank: con la parola yank si intende la copiatura nella clipboard di una parte di testo. Possiamo inserire il contenuto della clipboard in un'altra posizione del documento con un comando di paste. Per eseguire lo yank della linea corrente si possono utilizzare alternativamente yy oppure Y. Per eseguire lo yank di n linee a partire da quella corrente si utilizza nY. Per eseguire lo yank delle linee che vanno dalla numero N alla numero M si utilizza il comando :N,My
  • paste: abbiamo due possibilità p e P. Il comando p copia il contenuto della clipboard subito dopo il cursore, mentre P esegue l'incollatura sopra al cursore.

Si osservi che viene inserito nella clipboard anche l'oggetto dell'ultima operazione di cancellazione (sia esso un insieme di linee, lettere o parole).

COMANDO . (punto)
Molto utile! Ripete l'ultimo comando di modifica eseguito (sia esso un'inserzione di testo, una cancellazione, una sostituzione ...)