VI (visual editor) è il più importante e diffuso programma di editing dei file nell'ambiente UNIX e LINUX, in quanto possiede delle funzionalità che se utilizzate a fondo ne fanno uno strumento incredibilmente potente.
Per procedere all'editazione di un file basta digitare il comando "vi" seguito, o dal nome di un file già esistente nel caso in cui lo si voglia modificare, oppure dal nome di un nuovo file nel caso lo si voglia creare.
Nel momento in cui si procede all'editazione di un testo nell'ultima riga vengono sempre visualizzate le informazioni sul file aperto, come il numero di righe e di caratteri, il resto dell'area è destinata all'immissione dei comandi.
Se le righe non sono sufficienti a coprire tutta la porzione dello schermo a disposizione ne resteranno di vuote contrassegnate dalla tipica "~".
Questo editor possiede 3 diverse modalità di funzionamento in cui si svolgono azioni differenti:
Modalità d'inserimento o di input
Questo tipo di modalità fa riferimento alle azioni che consentono di modificare e aggiungere del testo. Una volta editato un file si accede a questa modalità con vari comandi, tra cui il tasto "i" che inserisce i caratteri prima del punto in cui è posizionato il cursore o "a" che invece inserisce i caratteri dopo il punto in cui è posizionato il cursore.
Modalità di comando visiva
La modalità di comando visiva permette di utilizzare una serie particolare di comandi ed è quella attivata di default. All'interno di questa modalità i comandi inseriti si riferiscono alla riga su cui è posizionato il cursore. Per passare alla modalità visuale da quella di inserimento, è sufficiente premere il tasto Esc.
Modalità di comando due punti
La terza e ultima modalità è quella che consente di utilizzare i comandi del salvataggio o dell'uscita dal programma. Per utilizzare questa modalità ed i conseguenti comandi premere ":" seguiti dal comando. In questo caso il cursore viene posizionato sull'ultima riga.
Vi offre la possibilità di utilizzare una serie di buffer per memorizzare parti di testo.
Chiunque abbia un po di dimestichezza con vi, sa che copiando una riga con l'istruzione yy
questa viene memorizzata in un buffer di default. Non tutti sanno invece che vi non possiede soltanto il buffer di default ma altri 26 buffer ognuno dei quali è associato ad una lettera dell'alfabeto. Per utilizzare il buffer associato alla lettera 'a', per esempio, dobbiamo riferirci ad esso con il comando "a
:
"ayy
copia la linea corrente nel buffer a
"ap
incolla il contenuto del buffer a sotto la riga corrente
"a4yy
copia 4 linee, a partire da quella corrente, nel buffer a
"a2p
incolla 2 copie del buffer a sotto la riga corrente
"add
cancella la riga corrente e la copia nel buffer a
Se ci riferiamo ad un buffer con la lettera minuscola il contenuto del buffer viene sostituito mentre se ci riferiamo ad un buffer con la lettera maiuscola il contenuto viene aggiunto a quello già presente nel buffer:
"Ayy
aggiunge la riga corrente al buffer a
"A3dd
cancella 3 righe, a partire da quella corrente, e le aggiunge al buffer a
Il contenuto dei buffer viene mantenuto anche quando passiamo da un file all'altro in una stessa sessione di vi con i comandi ex
:
vi [file1]
edita il file1
"b4yy
copia 4 linee nel buffer a
:e [file2]
passa a editare il file2
"ap
copia le 4 linee del file1 nel file2
In vi è possibile editare più file contemporaneamente ed utilizzare i comandi ex per spostarsi da un testo all'altro.
Il comando: vi [file1] [file2]
aprirà inizialmente il file1, tramite il comando :n
passiamo a editare il file2; se sono state apportate delle modifiche al file che stiamo editando che non sono state salvate, vi non permetterà di passare da un file ad un'altro, a meno di non forzare il comando aggiungendo alla fine un punto esclamativo :n!
; ovviamente in questo caso andranno perdute tutte le modifiche effettuate.
E' possibile anche utilizzare il comando vi *
per editare tutti i file di una directory; in questo caso è molto utile i l comando :f
che restituisce il nome del file che stiamo editando, oppure il comando :args
che restituisce la lista completa dei file aperti mettendo delle parentesi quadre attorno al file [corrente]
E' possibile inoltre passare ad un file che non è stato specificato nella riga di comando tramite la direttiva: :e [nomefile]
.
Vi associa il carattere # al file precedentemente editato, e il carattere % al file editato correntemente; quindi per tornare all'ultimo file editato è possibile utilizzare il comando: :e#
Qualora si voglia ad esempio salvare il file corrente con lo stesso nome ma con un'estensione .new
, si utilizzerà il comando: :w %.new
. Per tornare al primo file editato si utilizza il comando: :rew
.
Per il programmatore, ma anche per l'amministratore di sistema il quale si trova ad editare script shell e file di configurazione, la sintassi colorata dell'editor di testo permette di indivudare a colpo d'occhio le sezioni del file che interessano, nonche' parole chiave e variabili d'ambiente.
In VIM, se si desidera abilitare la Syntax Highlighting solo per la sessione corrente, è possibile utilizzare il comando :syntax on
e utilizzare :syntax off
per disabilitarla, :syntax clear
per disabiltarlo momentaneamente.
Nel caso in cui si desideri utilizzare la sintassi colorata sempre, per il proprio utente, è possibile inserire syntax enable
nel file .vimrc
nella propria home directory:
homer@Joker:~$ echo "syntax on" >> /homer/.vimrc
homer@Joker:~$ cat .vimrc
syntax enable
Il file in questione verrà letto ad ogni avvio di VIM.
Una caratteristica che di solito gli utenti recriminano a VI è la possibilità di effettuare selezioni che non siano solo linee intere...
Anche con vi è possibile fare selezioni come con gli editor moderni, basta avere una delle varianti "moderne" di VI: vim-enhanced (presente praticamente in tutte le distribuzioni).
Per verificare quale versione avete potete utilizzare il comando which
:
[root@paperopoli leo]# which vi
/bin/vi
una volta ottenuta l'informazione potete controllare con ls -la
se avete l'originale o una versione "evoluta":
[root@paperopoli leo]# ls -la /bin/vi
lrwxrwxrwx 1 root root 21 apr 9 12:09 vi -> /usr/bin/vim-enhanced*
Questa ad esempio è una versione evoluta, come dice il nome, allora si può utilizzare il tasto:
v
che consente di marcare l'inizio di un blocco di testo. A questo punto si possono usare i tasti freccia
(oppure h,j,k,l
) per muoversi evidenziando il testo interessato.
In sintesi: v + TASTI FRECCIA
Una volta terminata la selezione basterà premere
x
per tagliare la selezione
oppure
y
per copiarla
p
per incollarla.
Esistono vari comandi per inserire testo con VI.
La loro differenza fondamentalmente è su DOVE viene inserito il nuovo testo.
i
Inserisce testo prima del cursore
a
Aggiunge testo dopo il cursore
A
Aggiunge testo alla fine della riga
I
Aggiunge testo all'inizio della riga
o
Aggiunge una riga prima del cursore
O
Aggiunge una riga dopo il cursore
ESC
Esce dalla modalità di inserimento
BACKSPACE
Si sposta indietro di un carattere
Alcuni dei comandi di ricerca utilizzabili su VI
/ stringa
Ricerca la stringa stringa in avanti
? stringa
Ricerca la stringa stringa all'indietro
/
Ripete l'ultima ricerca in avanti
?
Ripete l'ultima ricerca all'indietro
n
Ripete l'ultima ricerca
t x
Si sposta avanti fino al carattere x sulla riga corrente
/ stringa /+n
Si sposta all'nesima riga dopo la stringa stringa
Es.:
se volessimo cercare la parola POST all'interno del seguente testo di un file
La rete è infida, un POST che latita in TIMEOUT
e il testo prezioso che hai scritto si può perdere fra REFRESH o BACK incompleti.
Prima di premere sotto, fatti una copia di sicurezza del testo inserito.
dovremmo innanzitutto assicurarci di avere il cursore posizionato all'inizio della prima riga. Digiteremo poi /POST
premendo il tasto INVIO.
Il cursore si posizionerà così subito prima della parola POST.
Se volessimo - sempre all'interno dello stesso testo - trovare semplicemente il carattere h della seconda riga, digiteremo t h
dopo aver posizionato il cursore all'inizio della seconda riga. Il cursore si sposterà così subito prima del carattere h della parola hai.
N.B. Nel caso del comando t, non verrà visualizzato nulla a fondo pagina come succede invece per la ricerca con /.
Ecco alcuni dei comandi più comuni per modificare il testo di un file
cw
Cancella la parola sotto il cursore ed entra in modalità inserimento.
dw
Cancella una parola sotto il cursore.
cc
Cancella l'intera riga sotto il cursore ed entra in modalità inserimento.
dd
o :d
Cancella la riga corrente (sotto il cursore).
:dn
Cancella n righe, a partire da quella corrente.
n cc
Cancella n righe e si mette in modalità inserimento.
Il salvataggio dei dati modificati con VI comprende anche l'aggiornamento della data/ora di modifica.
Ecco alcuni dei comandi più comuni:
zz
Esce da VI scrivendo solo se sono state apportate modifiche al file
:x
Come zz
:wq
Salva ed esce
:w
Salva
:w file
Salva una copia nel file file
:q
Esce
:q!
Forza l'uscita anche se non sono state salvate le modifiche fatte (che vengono perse).
VI è un editor di testi molto comune e diffuso su ogni Unix.
Per la sua natura testuale, lanciabile direttamente da shell, per le antiche origini e la larga diffusione è, insieme ad Emacs, l'editor di testi più utilizzato su Unix.
vi [file]
Apre il file con VI
vi [+n][file]
Apre il file con VI alla riga corrispondente al numero
Se non si specifica il nome del file VI apre una sessione nuova.
Per chi non lo conosce o chi ne usa solo una minima parte delle enormi possibilità, esiste un comodo e interessante strumento per approfondire e fare pratica con vi: Vimtutor.
E' un semplice ed ingegnoso comando, che apre una finestra di vi contenente un testo di spiegazioni e tutorial, che accompagna l'utente ad esplorare e conoscere vi, con prove pratiche eseguite direttamente sul testo.
Il testo del tutorial disponibile in molti linguaggi e per sceglirli, basta definirli come argomento: vimtutor it
.
Il tutorial è adatto a chi si avvicina per la prima volta a vi e a chi lo usa già, ma non ne sfrutta le enormi e comodo potenzialità. Il vantaggio di un simile approccio didattico supera ogni possibile testo scritto, come questi:
vi si impara usandolo e impratichendosi con i suoi comandi e un tutorial "live" è il mezzo in assoluto migliore per conoscere vi.
A volte puo essere utile salvare solo una parte del file che stiamo editando.
:10,20w [nuovoFile]
salva il testo compreso tra la riga 10 e la riga 20 su un nuovo file
:.,10w [nuovoFile]
salva il testo compreso tra la prima riga e la riga 10 su un nuovo file
:10,$w [nuovoFile]
salva il testo compreso tra la riga 10 e la file del testo su un nuovo file.
Volendo salvare una parte del file che stiamo editando sul file stesso è possibile utilizzare il comando:
:10,20w!
salva il testo compreso tra la riga 10 e la riga 20 sullo stesso file
Da notare che quest'ultimo comando è fuorviante in quanto non viene aggiornato il testo che stiamo editando, anche se a tutti gli effetti è stato cambiato. Per visualizzare la versione attualmente salvata dobbiamo usare il comando :e!
.