vi (software)

editor di testo per il sistema Unix

vi è un editor di testo con interfaccia testuale per BSD e Unix.

vi
software
Vim in Debian sid
Vim in Debian sid
Vim in Debian sid
GenereEditor di testo
SviluppatoreBill Joy ed altri
Data prima versione1976
Ultima versione7.3 (15 agosto 2010)
Sistema operativoUnix-like
LinguaggioC
LicenzaLicenza BSD
(licenza libera)
Sito webex-vi.sourceforge.net/

Il nome deriva dalla più breve abbreviazione non ambigua del comando visual in ex (cioè <vi>). Questo comando commuta l'editor di linea ex in modalità visuale. Vi insieme ad Emacs è stato uno dei protagonisti della cosiddetta guerra degli editor.

Storia modifica

Il programma venne scritto da Bill Joy nel 1976 per una delle prime versioni di BSD. Le prime versioni di vi non davano indicazione della modalità utilizzata, e quindi era comune premere il tasto ESC solo per assicurarsi di essere in modalità comando (vi segnala con un "beep" di esser già in modalità comando, se si tenta di rientrarvi). Le versioni recenti di vi danno indicazione del modo corrente nella linea di stato corrente o graficamente. Le versioni grafiche di vi (per esempio gvim) supportano l'utilizzo del mouse e l'accesso ai comandi tramite menù grafici.

Successivamente, è diventato l'editor standard de facto per Unix ed il preferito dagli utenti fino all'arrivo di Emacs dopo il 1984. Ancora nel 2014 vi o uno dei suoi cloni può essere trovato in quasi tutte le versioni di Unix (la Single UNIX Specification indica vi come editor, quindi ogni sistema conforme alla specifica è dotato di vi).

Ancora negli anni Duemila dunque, vi è solitamente preinstallato nei sistemi Unix-like (ad esempio, sia le diverse versioni di Linux, che Mac Os).

È stato uno dei programmi più largamente usati dagli utenti Unix (secondo un sondaggio del 1991 su Usenet era preferito dalla metà dei votanti).[senza fonte]

Caratteristiche modifica

Per comodità, lo stesso programma parte in modalità vi o ex a seconda del nome con cui lo si lancia. "vi" è un'abbreviazione che si pronuncia lettera per lettera come [ vi: ai ] e non come parola [ vai ].
Si avvia più rapidamente di Emacs e necessita di meno memoria, quindi anche alcuni sostenitori di Emacs lo utilizzano come editor per le e-mail o piccole modifiche.

Vi viene comunemente ritenuto piuttosto difficile per un nuovo utente (ovvero, vi presenta una curva di apprendimento piuttosto ripida) a BSD e Unix perché è un editor modale.

Un editor modale (come ogni altro programma modale) assegna differenti azioni ai tasti a seconda della modalità attiva nel momento in cui vengono premuti. Le principali modalità di modifica in vi sono i modi insert (inserimento) e command (comando). In modalità inserimento, quando si preme un tasto, il carattere digitato viene interpretato come appartenente al testo da inserire nell'editor e non come un comando, come invece accade nella modalità precedente. Premendo il tasto ESC dalla modalità inserimento si può tornare in ogni momento alla modalità comando; per passare invece in modalità inserimento si digita il carattere (comando) i: l'ingresso alla nuova modalità è segnalata dalla comparsa della scritta -- INSERT --. Tornando alla modalità comando, si possono distinguere comandi di solito più complessi che richiedono dapprima di digitare il carattere due-punti : seguiti a volte dalle altre opzioni (come accade nelle funzionalità di ricerca e inserimento di un testo, anche se nei casi della citata operazione di undo :u o quella di cancellazione della riga corrente :d il comando è relativamente semplice), oppure senza i due punti (come accade ad esempio nel comando w per la posizionare il cursore all'inizio della parola successiva a quella corrente).

Pro e contro dei programmi modali modifica

In modalità comando, ad ogni carattere corrisponde un movimento del cursore o una funzione di modifica (per esempio, con j il cursore si sposta alla linea successiva, con k si sposta alla linea precedente, x cancella un carattere e i (insert) o a (append) ritornano alla modalità inserimento). Questa modalità, dal punto di vista dell'usabilità, è molto più complessa di un qualsiasi programma ad interfaccia grafica, ma esistono delle motivazioni per cui viene ancora usata. Ai tasti premuti in modalità 'comando' non corrisponde in genere nessun carattere visualizzato, salvo eccezioni quali, ad esempio ":" (il cursore) oppure "/": questa è probabilmente uno dei maggiori motivi di confusione per i nuovi utilizzatori.

Alcuni comandi possono essere molto pericolosi: ad esempio, premendo la D maiuscola si cancella la riga corrente dal cursore fino alla fine della stessa e, se questo avviene inavvertitamente, può compromettere il lavoro svolto o il file. Tuttavia, il comando :u è sempre utilizzabile per annullare l'ultima operazione, dunque anche in caso di errore. È molto arduo conoscere le funzionalità di un programma del genere senza un manuale, a differenza dei programmi con menu grafici e barra degli strumenti, dove sono rappresentate le funzionalità disponibili. In vi non funzionano combinazioni di comandi molto comuni in altri contesti, come CTRL-z per annullare l'ultima operazione. Nuove funzionalità vengono aggiunte di rado.

Esistono delle situazioni in cui utilizzare un programma senza interfaccia grafica è indispensabile, ovvero quando è necessario modificare file remoti tramite l'uso del solo terminale. Tale operazione, eseguita in locale, richiederebbe infatti lo scaricamento, la modifica ed il reinvio dei file modificati, oppure l'attivazione di un'interfaccia che permetta la modifica diretta in remoto, comunque più dispendiosa in termini di risorse qualora le modifiche richieste siano minime (ad esempio, il cambio di un'impostazione in un file di inizializzazione .ini, o analogamente di un altro file di configurazione). L'uso di programmi ad interfaccia grafica ovviamente richiede l'uso del mouse, i cui movimenti devono essere inviati in tempo reale al server remoto.

Uno dei vantaggi di avere una modalità comando distinta dall'inserimento del testo vero e proprio risiede nel fatto che più operazioni di modifica possono essere fatte mediante una sola riga della tastiera senza dover premere contemporaneamente i tasti Alt, Ctrl o altri modificatori, cosa che riduce di almeno un fattore due il numero di tasti da premere per attivare le stesse funzioni base dell'editor. Inoltre, la modalità separata fa sì che le operazioni di modifica più complesse si possano ottenere giustapponendo più primitive semplici (per esempio, dw per cancellare una parola, c2fa per cambiare il testo dal cursore presente in corrispondenza della seconda "a"). C'è da considerare anche che la doppia modalità consente l'uso del vi praticamente su qualsiasi tipo di terminale, in quanto le sequenze di carattere associato a ciascuno di essi variano (^? al posto di ^H per il backspace, ad esempio), mentre le lettere dell'alfabeto e caratteri come ":" o "/" sono presenti su qualunque tipo di tastiera. Per gli utilizzatori esperti, questo permette un lavoro molto più veloce, anche perché è possibile utilizzare i comandi di vi con la sola riga principale della tastiera, senza ad esempio dover spostare le mani sui tasti freccia. In molte versioni di vi comunque è possibile utilizzare anch'essi per spostarsi all'interno del testo in qualsiasi modalità, così come anche BACKSPACE o CANC per cancellare testo; tali tasti potrebbero però non funzionare se si utilizza vi da terminali remoti.

Manipolazione del testo modifica

Ricerca e sostituzione di parole e stringhe modifica

Un punto di forza nell'uso di vi è dovuto alla potenza espressiva ed operativa delle funzioni di ricerca e sostituzione basate sull'uso di espressioni regolari, ereditate in gran parte dall'editor ex, ed attivate utilizzando i comandi / e: che ridirigono il cursore sull'ultima linea della finestra per introdurre i dati per la ricerca/sostituzione. Questo consente ad un utente esperto di ottenere con un solo comando operazioni che in editor tradizionali potrebbero richiedere anche centinaia di azioni elementari. Per esempio, un'operazione come quella di trasformare in un testo tutte le parole isolate "if" in "IF" (delimitate queste da '<' e '\>') ignorando i caratteri interni ad altre parole si ottiene digitando semplicemente, in modalità comando:

:g/\<if\>/s//IF/g

oppure, ancor più semplicemente, il comando di sostituzione (g) applicato alla stringa (%s, ovvero "sostituzione") da rimpiazzare (if) con la stringa nuova (IF)[1]:

:%s/if/IF/g

Copia e incolla di testi lunghi modifica

È possibile anche compiere operazioni di copia-e-incolla. Ad esempio, in modalità comando, è possibile selezionare una o più righe contigue tramite il comando V. Dopo la selezione è possibile la cancellazione (tramite il comando d) o il paste (tramite il comando p). Senza uscire dalla modalità comando, è possibile utilizzare le funzioni per spostarsi all'interno del testo tra la fase di copia e quella di incolla. Lo spostamento, oltre a quelli nelle 4 direzioni, consente di arrivare direttamente ad una riga, oppure alla fine del testo (tramite il comando G). Ad esempio, per andare direttamente alla riga 257 del file (in modalità comando):

:257

Comandi principali modifica

Posizionamento:

   h, j, k, l   movimento all'interno del testo, rispettivamente sx, giù, su, dx;

   0 (zero)    sposta il cursore al primo carattere della riga;

   ^         sposta il cursore a primo carattere "non blank" della riga;

   $         sposta il cursore sull'ultimo carattere della riga;

   b         sposta il cursore all'inizio della parola precedente;

   e         sposta il cursore alla fine della parola successiva;

  gg         sposta il cursore a inizio documento;

(n)G       sposta il cursore alla riga n (default ultima).

Ricerca:

 /STRINGA      cerca STRINGA da lì in avanti;

 ?STRINGA      cerca STRINGA all'indietro;

 n             ripete la ricerca nella medesima direzione.

Digitazione:

   i        inserire testo nella posizione in cui si trova il cursore;

   a        inserire testo DOPO la posizione del cursore;

   I        inserire testo all'inizio della riga dove si trova il cursore;

   A        agguiungere testo alla fine della riga dove si trova il cursore;

   o        apre una riga sotto quella del cursore e permette l'inserimento di caratteri;

   O        apre una riga sopra quella del cursore e permette l'inserimento di caratteri;

   (n)s        sostituisce n caratteri a partire da quello sotto il cursore con quelli digitati, default 1;

  C               sostituisce tutti i caratteri della riga a partire dalla posizione del cursore;

   cw        (Change Word) cambia la parola in cui si trova il cursore (la 'word' è delimitata dai caratteri [.] [,] [-] [blank] [tab]);

   cW        (Change Word) cambia la parola in cui si trova il cursore (la 'word' è delimitata solo da [blank] [tab]);

Eliminazione (qualunque cosa eliminata finisce nell'area di memoria):

   (n)x        cancella n caratteri da dove si trova il cursore, default 1;

   (n)X        cancella n caratteri prima del cursore, default 1;

   D        cancella la riga dal cursore in poi;

   dd        cancella tutta la riga.

       dw / dW         cancellano la parola nello stesso modo in cui agiscono cw e cW;

Varie:

   yy        copia in menoria la riga in cui si trova il cursore;

   p        inserisce dopo il cursore l'ultima cosa copiata o cancellata;

   P        inserisce prima il cursore l'ultima cosa copiata o cancellata;

   u        annulla l'ultimo comando impartito (^r ripristina l'annullamento);

   .        ripete l'ultimo comando effettuato;

       :r FILE         inserisce il contenuto di FILE dopo il cursore;

       :.s/XXX/YYY/g   sostituisce nella riga in cui si trova il cursore tutte le ricorrenze di XXX con YYY;

       :g/XXX/s//YYY/g sostituisce in tutto il file ogni occorrenza di XXX con YYY;

       ~               cambia il case del carattere (da minuscolo a maiuscolo o viceversa) e si sposta sul successivo;

Salvataggio/Chiusura:

       :q              quit (se non si sono apportate modifiche);

       :q!             forza il quit annullando le modifiche apportate;

       :w              salva le modifiche;

       :w!             forza il salvataggio (permessi parzialmente limitati sul file);

       ZZ o :wq        salva ed esce;

       :wq!            forza il salvataggio ed esce;

       :e              annulla le modifiche e riapre il file originario (o dall'ultimo salvataggio);

       :n              passa al file successivo (se da riga comando se ne aprono diversi);

       :n!             forza il passaggio al file successivo annullando le modifiche;

Programmi derivati da vi e cloni modifica

  • Vim — "Vi IMproved" — è il più noto tra gli eredi di vi, si tratta di un clone aggiornato [1]
  • Su Sourceforge è presente una versione adattata a BSD. Utilizza ed come base di partenza [2]
  • nvi è un'implementazione dell'editor di testi ex/vi distribuito originariamente come parte di Fourth Berkeley Software Distribution (4BSD) [3] Archiviato il 5 dicembre 2006 in Internet Archive.
  • bvi "Binary VI" — un editor per file binari basato su vi [4]
  • Elvis è un clone di vi per Unix ed altri sistemi operativi [5]
  • Vigor è l'editor vi con l'aggiunta del Vigor Assistant, un personaggio animato volutamente irritante modellato su Clippy di Microsoft Office [6]
  • VILE o Vi Like Emacs è un insieme di macro per Emacs che permette di usare i comandi di vi [7] Archiviato l'11 agosto 2004 in Internet Archive.

Curiosità modifica

vi è presente nella Evans Hall all'Università della California.

Note modifica

  1. ^ (EN) Vi and Vim Editor: 12 Powerful Find and Replace Examples, su thegeekstuff.com. URL consultato il 29 novembre 2017.

Voci correlate modifica

Altri progetti modifica

Collegamenti esterni modifica

Controllo di autoritàGND (DE4195682-5
  Portale Software libero: accedi alle voci di Wikipedia che trattano di Software libero