Vi

Wikibooks, manuali e libri di testo liberi.
Copertina

Cos'è[modifica]

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 centinia 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[modifica]

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[modifica]

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

Vim[modifica]

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[modifica]

Per lanciare Vi è sufficiente eseguire al prompt del terminale

vi [nome file]

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

Esitono 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

i

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

h  movimento verso sinistra
l  movimento verso destra
j  movimento verso il basso
k  movimento verso l'alto

Sulla maggior parte delle piattaforme funzionano anche i tasti:

FRECCIASX, FRECCIADX, FRECCIASU, FRECCIAGIU'

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 è

ESC : w

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 è

ESC : q

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[modifica]

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 sui 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[modifica]

inserimento o modifica

i

Attiva la modalità INSERT. Inserimento a partire dalla posizione del cursore

I

Attiva la modalità INSERT. Inserimento a partire dall'inizio della riga

a

Attiva la modalità INSERT. Inserimento a partire dalla posizione a destra del cursore

A

Attiva la modalità INSERT. Inserimento a partire dalla fine della riga

o
O

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

r

Mantiene la modalità ESCAPE. Permette di inserire un singolo carattere a sostituzione del carattere che si trova sotto il cursore


R

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

s

Attiva la modalita INSERT. Permette di sostituire il carattere su cui è posizionato il cursore con una stringa arbitraria di caratteri

c seguito da un comando di spostamento

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

C

Attiva la modalità INSERT. Svuota la linea a partire dalla posizione del cursore

<ESC>

Ovunque premuto, attiva la modalità ESCAPE

Cancellazioni

x

Mantiene la modalità ESCAPE. Cancella il carattere su cui è posizionato il cursore

X

Mantiene la modalità ESCAPE. Cancella il carattere a sinistra del cursore

d seguito da un comando di spostamento

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

D

Mantiene la modalità ESCAPE. Cancella dalla posizione del cursore alla fine della linea

dd

Mantiene la modalità ESCAPE. Elimina la riga su cui è posizionato il cursore

d'x

cancella dalla riga corrente alla linea marcata dal crt "x"


spostamenti

l  o <SPACEBAR>

Spostano il cursore un carattere a destra

h o <BACKSPACE>

Spostano il cursonre un carattere a sinistra

j o <INVIO>

Sposta il cursore una riga in basso

k 

Sposta il cursore una riga in alto

0 o ^

Sposta il cursore a inizio riga

$

Sposta il cursore a fine riga

(n.linea)G

Sposta il cursore alla riga (n.linea)

(n.col.)|

Sposta il cursore alla colonna (n.col.)

w

Sposta il cursore all'inizio della parola successiva (si ferma alle punteggiature)

W

Sposta il cursore all'inizio della parola successiva (non si ferma alle punteggiature)

b

Sposta il cursore all'inizio della parola precedente (si ferma alle punteggiature)

B

Sposta il cursore all'inizio della parola precedente (non si ferma alle punteggiature)

e

Sposta il cursore alla fine della parola (si ferma alle punteggiature)

E

Sposta il cursore alla fine della parola (non si ferma alle punteggiature)

G

Sposta il cursore all'ultima riga del file

H

Sposta il cursore in cima alla pagina video

M

Sposta il cursore al centro della pagina video

L

Sposta il cursore in fondo alla pagina video


al punto in cui eravamo prima dell'ultimo spostamento

'(crt)

alla riga marcata (vedi m) con la lettera (crt)

Ctrl-U

Sposta la visualizzazione mezza pagina indietro

Ctrl-D

Sposta la visualizzazione mezza pagina avanti

Ctrl-F

Sposta la visualizzazione una pagina avanti

Ctrl-B

Sposta la visualizzazione una pagina indietro

z<RETURN>

Porta la riga corrente ad inizio pagina

z.

Porta la riga corrente a centro pagina

z-

Porta la riga corrente a fine pagina


Comandi vari

Ctrl-R Ctrl-L

ridisegnano la pagina video

Ctrl-G

dati sul file che stiamo editando

u

Annulla l'ultima operazione fatta ripristinando la situazione a prima dell'ultimo inserimento o modifica

U

se non ci si e' spostati dalla riga ripristina la riga a come quando ci siamo posizionati su di essa

.

ripete l'ultimo comando

J

unifica la linea con quella seguente

Y

copia la linea(e) in un buffer provvisorio

p
P

Incolla (paste) il contenuto del registro di default (registro ") prima (p) o dopo (P) la posizione corrente

"aY

copia la linea(e) nel buffer "a"

"ap

copia il contenuto del buffer "a" dopo il cursore

"ayL

copia nel buffer "a" le righe comprese tra il cursore e la fine della pagina video (L=spostamento)

/(string.)

cerca in avanti nel testo la stringa (string.)

n

continua la ricerca in avanti

?(string.)

cerca indietro nel testo la stringa (string.)

N

continua la ricerca all'indietro

fa

cerca sulla riga il carattere "a"

;

ripete la ricerca di tipo f

Fa

come f all'indietro

,

come ; all'indietro

ma

marca la linea con li carattere "a"

ZZ (:wq)

Salva ed esce

yy

Copia (yank) la riga corrente nel registro di default (registro ")

Utilizzo dei buffer[modifica]

"ayy

Copia la riga corrente nel buffer a

"aP

Incolla in contenuto del buffer a dopo la riga corrente

"q5dd

Cancella 5 righe e le mette nel buffer q

"qP

Incolla le cinque righe cancellate dopo la riga corrente

Modalità comandi a linea[modifica]

:1,$ s/frase1/frase2/g

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


:%s/frase1/frase2/g

sintassi alternativa al comando sopra. %s si riferisce a tutto il file.


:10,20 s/pippo//g

Da scoprire


:q!

Chiude il file senza salvare!

:w newfile

salva le variazioni in newfile, lasciando l'originale invariato.


:

entra in modo 'ex' (editor di linea)

:q!

Forza l'uscita anche dopo modifiche

:q

esce da vi

:wq

scrive ed esce

:w file

scrive il file (file)

:w>> (file)

aggiunge al file (file)

:1,5 co 25

copia le linee da 1 a 5 sotto la linea 25

:.,10 d

cancella le linee

:.,$ d

cancella le linee dalla corrente all'ultima

:1,$ :%

dalla prima all'ultima riga del file

:.,+7 d

cancella dalla riga corrente alla settima riga successiva

:.,'x d

cancella dalla riga corrente alla riga marcata dal crt. "x"

:n

legge il prossimo file

:e (file)

legge il file (file)

:e#

edita il file precedente

:r (file)

aggiunge all'editor il file (file) sotto la riga corrente

:g/s1/p

stampa a video tutte le righe contenti s1

:g/s1/s/s2/s3/gp

su tutte le righe contenenti s1 sostituisce la stringa s2 con s3 per tutte le occorrenze sulla riga e la stampa a video

:v/s1/p

stampa a video tutte le righe che non contengono s1

:m 25,54 70

sposta le righe da 25,54 sotto la riga 70

:sh

apre una shell

!(movim.)(cmd.)

riporta nel testo agendo tra la riga corrente e la riga di arrivo di (movim.) il risultato di (cmd.)

!Lsort

ordina le righe comprese tra la riga corrente e l'ultima riga a video

:set all

visualizza i settaggi

:se nu

abilita la visualizzazione dei numeri riga

:map

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.

\1 \2 ....

primo,secondo,... blocco (fra parentesi quadre).

\U

upper case (Maiuscola).

\L

lower case (Minuscola).

\E

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.

  :g/.cbl/s/\[.*\].cbl/\U\1\E.cbl/


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.

  :g/.*/s//mv & \/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.

  ci si posiziona sulla riga 1                        1G
                                                      !
  ci si sposta sulla riga 200                         200G
  si ordinano le righe da 1 a 200                     sort
  ci si posiziona sulla riga 1                        1G
                                                      !
  ci si sposta sulla riga 200                         200G
  si eliminano in questo range le linee uguali        uniq

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

  scrivo su un rigo la macro       j$xxxk
  registro il rigo nel buffer a    "AY
  eseguo la macro con              @A

2. setto il tasto ctrl-F1 ad eseguire la macro dell'esempio 1

  :se map ctrl-F1 j$xxxk (su dos non lo accetta)

Modalità editing[modifica]

CTRL+V

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