# Vi

    Copertina

## Cos'è

Vi è un editor di testo a interfaccia testuale. È pensato per editare testi in caratteri ASCII, quali file amministrativi di configurazione, listati di programmi, e in genere tutti quei testi che non necessitano di abbellimenti tipografici (quali il grassetto, l'italico, etc...). A dispetto della sua essenzialità, vi offre caratteristiche avanzate che facilitano l'editing di tipi di file specifici, quali, ad es., l'automazione di azioni ripetitive e la manipolazione di più file. Alcune versioni forniscono inoltre funzioni specifiche per editare linguaggi di programmazione (quali C, HTML, e centinaia di altri formati).
Vi è un editor di testi in formato puro, ossia in caratteri ASCII. Nato più di trent'anni fa, è tutt'ora inserito in quasi tutte le versioni del sistema operativo UNIX, e si può considerare come l'editor onnipresente nel mondo UNIX.

## Perché imparare Vi

Per avere a disposizione un potente strumento di editing. Vi è conosciuto da ogni amministratore di sistemi unix/linux dato che è un editor presente in ogni distribuzione e viene utilizzato quando si vogliono effettuare rapidamente correzioni a file testuali senza usare l'interfaccia grafica. Vi viene utilizzato anche come editor di emergenza infatti per essere eseguito non richiede particolari librerie o processi in esecuzioni e quindi funziona anche quando il sistema non è totalmente configurato o non è totalmente operativo. Inoltre, la sua mancanza di interfaccia grafica e la sua leggerezza lo rendono uno strumento ideale per il lavoro su computer remoti, compito primo di un amministratore di sistemi unix. Esagerando, ma non troppo, si può dire che non esiste un amministratore che non conosca Vi, o addirittura che la conoscenza di Vi è condizione necessaria per definirsi amministratori (per quanto non sufficiente).

## Trivia

Vi si pronuncia all'inglese, ossia vi-ai.

## Vim

Esistono diverse implementazioni di Vi, e una delle più diffuse è Vim, che è inclusa, fra l'altro, in quasi tutte le distribuzioni Linux. Tenendo a mente che Vim è un'estensione di vi, e che quindi non è detto che tutti i Vi che incontrerete avranno le stesse estensioni, si può senz'altro utilizzare questa ottima implementazione, scaricabile con licenza GPL da http://www.vim.org/download.php

## Quickstart

Per lanciare Vi è sufficiente eseguire al prompt del terminale
[nome file] può riferirsi a un file esistente, oppure a un file ancora da creare. Se [nome file] è omesso, Vi chiederà in fase di salvataggio di dare un nome al testo creato. L'interfaccia di Vi è composta dall'area per editare il testo e da una o due righe in basso. Nelle righe in basso viene usualmente indicata la modalità attiva (vedi sotto) e vengono inseriti i comandi. Su alcune distribuzioni Linux il comando Vim lancia l'editor in una configurazione più estesa, che ne facilita l'uso. Va ricordato che tale modalità non è però standard Vi.
Esistono due principali modalità di funzionamento per Vi:
* modalità comandi (detta anche modalità ESCAPE): premendo i tasti della tastiera non si inseriscono nel testo i corrispondenti caratteri, bensì si effettuano delle azioni sul testo stesso. I comandi inseribili possono essere raggruppati in due categorie:
** comandi immediati: hanno effetto sul testo in relazione alla posizione del cursore. Si tratta, in genere, di comandi formati da un numero limitato di caratteri (da cui una certa difficoltà nel ricordali a memoria).
** comandi a linea: immettendo il carattere due punti (:) si attiva una linea comandi in cui è possibile inserire stringhe di comandi, anche piuttosto complessi, che vengono eseguiti premendi INVIO. Questi comandi sono simili all'editor di linea 'ex' e usano concetti di editing simili a 'perl' e 'awk'
* modalità INSERT: permette di inserire e cancellare il testo. Il suo funzionamento è abbastanza intuitivo (vengono inseriti i caratteri corrispondenti ai tasti premuti, e ci mancherebbe altro!), ma il posizionamento del cursore (ossia del punto in cui vengono inseriti i nuovi caratteri) è da considerarsi un po' primitivo; il movimento non avviene con il mouse, bensì con degli appositi tasti (vedi sotto), ed è possibile muoversi solo sul testo già inserito. Inoltre, il passaggio dalla modalità INSERT alla modalità ESCAPE muove il cursore indietro di una posizione, un comportamento non intuitivo di cui è bene tenere conto.
All'avvio Vi è in modalità ESCAPE. Per passare alla modalità INSERT bisogna premere
che è quindi il primo comando Vi che dobbiamo conoscere. Attenzione! Vi, come tutto unix, è case sensitive, ossia tutti i comandi vanno dati rispettando le maiuscole e le minuscole. In genere, ogni comando minuscolo ha un significato diverso se dato in maiuscolo. È ora possibile iniziare a inserire il testo. Per muovere il cursore sul testo, bisogna essere in modalità ESCAPE e utilizzare i tasti
Sulla maggior parte delle piattaforme funzionano anche i tasti:
Va notato che questo non è un comportamento standard, poiché vi è stato originariamente pensato per funzionare con tastiere che non hanno questi tasti. In particolare, potreste trovarvi in difficoltà quando lavorate su un sistema remoto via terminale; in questo caso la funzionalità dei tasti freccia dipende anche dal particolare setting del terminale, e quindi, a maggior ragione, non è garantita.
Il comando per salvare su disco il file viene invocato dalla linea comandi, la quale, a sua volta, viene attivata in modo ESCAPE inserendo il carattere due punti (:). Quindi, la sequenza per salvare il file è
dove, appunto, w è il comando di salvataggio (w=write).
Il comando per uscire dall'editor è q (q=quit) e va dato dalla linea comandi, quindi la sequenza è
Noterete ben presto che premere il tasto ESC quando si è già in modo ESCAPE provoca un beep d'errore; in effetti è del tutto ridondante, però imparerete ben presto a sopportare il beep e a effettuare ripetute premute del tasto ESC, in quanto è sempre bene essere sicuri di essere in modo ESCAPE prima di inserire un comando, altrimenti i caratteri inseriti vi andranno a modificare il testo. Non vi preoccupate: a parte il beep non ci sono altre controindicazioni.

## Comandi

Questo è un elenco di comandi di Vi. Esiste una pagina ufficiale per i Tip di Vim. Una buona collezione di suggerimenti è questa, a cui chiunque può contribuire con suoi propri suggerimenti. Sarebbe bello che ognuno contribuisse con i suoi suggerimenti. Nota che tutte le operazioni di ricerca e sostituzione in vim supportano le espressioni regolari Ricordo che i comandi devono essere invocati in modalità ESCAPE; alcuni di essi, attivano la modalità INSERT, mentre altri mantengono la modalità ESCAPE. È quindi chiaro che solo questi ultimi potranno essere dati in serie.

### Modalità comandi immediati

inserimento o modifica
Attiva la modalità INSERT. Inserimento a partire dalla posizione del cursore
Attiva la modalità INSERT. Inserimento a partire dall'inizio della riga
Attiva la modalità INSERT. Inserimento a partire dalla posizione a destra del cursore
Attiva la modalità INSERT. Inserimento a partire dalla fine della riga
Attiva la modalita INSERT. Inserimento a partire da una nuova riga sotto (o) oppure sopra (O) quella corrente
Mantiene la modalità ESCAPE. Cambia il case del carattere corrente ( da maiuscolo in minuscolo e viceversa ) e sposta il cursore a destra di una posizione
Mantiene la modalità ESCAPE. Permette di inserire un singolo carattere a sostituzione del carattere che si trova sotto il cursore
Attiva la modalità REPLACE. Permette di sostituire tutti i caratteri a partire dalla posizione iniziale del cursore fino alla pressione del tasto <ESC>, che riporta in modalità ESCAPE
Attiva la modalita INSERT. Permette di sostituire il carattere su cui è posizionato il cursore con una stringa arbitraria di caratteri
Attiva la modalità INSERT. Permette di sostituire con nuovi caratteri dalla posizione del cursore al punto di arrivo del comando di spostamento. Esempio cw permette di sostituire i caratteri fino alla fine della parola su cui è posizionato il cursore (vedi il comando w nella categoria Spostamenti).
Attiva la modalità INSERT. Svuota la linea a partire dalla posizione del cursore
Ovunque premuto, attiva la modalità ESCAPE
Cancellazioni
Mantiene la modalità ESCAPE. Cancella il carattere su cui è posizionato il cursore
Mantiene la modalità ESCAPE. Cancella il carattere a sinistra del cursore
cancella dalla posizione del cursore al punto di arrivo del comando di spostamento. Esempio dw cancella fino alla fine della parola su cui è posizionato il cursore (vedi il comando w nella categoria Spostamenti).
Mantiene la modalità ESCAPE. Cancella dalla posizione del cursore alla fine della linea
Mantiene la modalità ESCAPE. Elimina la riga su cui è posizionato il cursore
cancella dalla riga corrente alla linea marcata dal crt "x"
spostamenti
Spostano il cursore un carattere a destra
Spostano il cursonre un carattere a sinistra
Sposta il cursore una riga in basso
Sposta il cursore una riga in alto
Sposta il cursore a inizio riga
Sposta il cursore a fine riga
Sposta il cursore alla riga (n.linea)
Sposta il cursore alla colonna (n.col.)
Sposta il cursore all'inizio della parola successiva (si ferma alle punteggiature)
Sposta il cursore all'inizio della parola successiva (non si ferma alle punteggiature)
Sposta il cursore all'inizio della parola precedente (si ferma alle punteggiature)
Sposta il cursore all'inizio della parola precedente (non si ferma alle punteggiature)
Sposta il cursore alla fine della parola (si ferma alle punteggiature)
Sposta il cursore alla fine della parola (non si ferma alle punteggiature)
Sposta il cursore all'ultima riga del file
Sposta il cursore in cima alla pagina video
Sposta il cursore al centro della pagina video
Sposta il cursore in fondo alla pagina video
al punto in cui eravamo prima dell'ultimo spostamento
alla riga marcata (vedi m) con la lettera (crt)
Sposta la visualizzazione mezza pagina indietro
Sposta la visualizzazione mezza pagina avanti
Sposta la visualizzazione una pagina avanti
Sposta la visualizzazione una pagina indietro
Porta la riga corrente ad inizio pagina
Porta la riga corrente a centro pagina
Porta la riga corrente a fine pagina
Comandi vari
ridisegnano la pagina video
dati sul file che stiamo editando
Annulla l'ultima operazione fatta ripristinando la situazione a prima dell'ultimo inserimento o modifica
se non ci si e' spostati dalla riga ripristina la riga a come quando ci siamo posizionati su di essa
ripete l'ultimo comando
unifica la linea con quella seguente
copia la linea(e) in un buffer provvisorio
Incolla (paste) il contenuto del registro di default (registro ") prima (p) o dopo (P) la posizione corrente
copia la linea(e) nel buffer "a"
copia il contenuto del buffer "a" dopo il cursore
copia nel buffer "a" le righe comprese tra il cursore e la fine della pagina video (L=spostamento)
cerca in avanti nel testo la stringa (string.)
continua la ricerca in avanti
cerca indietro nel testo la stringa (string.)
continua la ricerca all'indietro
cerca sulla riga il carattere "a"
ripete la ricerca di tipo f
come f all'indietro
come ; all'indietro
marca la linea con li carattere "a"
Salva ed esce
Copia (yank) la riga corrente nel registro di default (registro ")

### Utilizzo dei buffer

Copia la riga corrente nel buffer a
Incolla in contenuto del buffer a dopo la riga corrente
Cancella 5 righe e le mette nel buffer q
Incolla le cinque righe cancellate dopo la riga corrente

### Modalità comandi a linea

sotituisce (s///) nelle rige da 1 all'ultima ($) tutte le occorrenze (g) (se omesso g solo la prima di ogni riga) di frase1 con frase2
sintassi alternativa al comando sopra. %s si riferisce a tutto il file.
Da scoprire
Chiude il file senza salvare!
salva le variazioni in newfile, lasciando l'originale invariato.
entra in modo 'ex' (editor di linea)
Forza l'uscita anche dopo modifiche
esce da vi
scrive ed esce
scrive il file (file)
aggiunge al file (file)
copia le linee da 1 a 5 sotto la linea 25
cancella le linee
cancella le linee dalla corrente all'ultima
dalla prima all'ultima riga del file
cancella dalla riga corrente alla settima riga successiva
cancella dalla riga corrente alla riga marcata dal crt. "x"
legge il prossimo file
legge il file (file)
edita il file precedente
aggiunge all'editor il file (file) sotto la riga corrente
stampa a video tutte le righe contenenti s1
su tutte le righe contenenti s1 sostituisce la stringa s2 con s3 per tutte le occorrenze sulla riga e la stampa a video
stampa a video tutte le righe che non contengono s1
sposta le righe da 25,54 sotto la riga 70
apre una shell
riporta nel testo agendo tra la riga corrente e la riga di arrivo di (movim.) il risultato di (cmd.)
ordina le righe comprese tra la riga corrente e l'ultima riga a video
visualizza i settaggi
abilita la visualizzazione dei numeri riga
visualizza i mappaggi particolari.
Note per le stringhe s1,s2,s3 etc.:
inizio riga.
fine riga.
qualsiasi carattere.
il carattere successivo non viene interpretato (nomagic).
sequenza di caratteri.
sequenza trovata.
primo,secondo,... blocco (fra parentesi quadre).
upper case (Maiuscola).
lower case (Minuscola).
fine cambio case.
Esempi dell'utilizzo di ex:
1. Si ha una lista di nomi di files, in questa lista vogliamo che i file con estensione .cbl abbiano il nome maiuscolo.
2. Si ha una lista di nomi di files, da questa lista vogliamo ricavare un comando che sposti, con il comando mv, i files nella directory /tmp.
Esempi di utilizzo di altre funzioni:
1. Si vogliono ordinare le righe dalla 1 alla 200 e dopo eliminare le righe che si susseguono uguali.
Esempi di utilizzo di buffer come macro:
Posso registrare dentro un buffer delle macro da utilizzare oppure le posso associare ad un tasto funzione tramite il map (anche usando il file di configurazione .exrc).
1. voglio registrare una macro che mi tolga dalla riga successiva gli ultimi 3 caratteri
2. setto il tasto ctrl-F1 ad eseguire la macro dell'esempio 1

### Modalità editing

entra in modalità blocco visuale, ovvero permette di selezionare una porzione di testo per copiare (ESC y) o cancellare (ESC d)