# Vi (software)

vi è un editor di testo con interfaccia testuale per BSD e Unix.
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

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

## Caratteristiche

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

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
#### Ricerca e sostituzione di parole e stringhe

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:
oppure, ancor più semplicemente, il comando di sostituzione (g) applicato alla stringa (%s, ovvero "sostituzione") da rimpiazzare (if) con la stringa nuova (IF):

#### Copia e incolla di testi lunghi

È 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):

#### Comandi principali

Posizionamento:
(n)G sposta il cursore alla riga n (default ultima).
Ricerca:
Digitazione:
Eliminazione (qualunque cosa eliminata finisce nell'area di memoria):
Varie:
Salvataggio/Chiusura:

## Programmi derivati da vi e cloni

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

## Curiosità

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