In informatica, con il termine editing ci si riferisce spesso alla elaborazione di file di testo semplici.
Nei sistemi Unix, il programma più importante per la creazione e la modifica dei file di testo è vi. È più importante perché onnipresente, soprattutto nei dischetti di emergenza, anche se non si tratta di un programma comodo da utilizzare.
vi ha una logica di funzionamento tutta sua che ne impedisce l'utilizzo a chi non abbia letto nulla al riguardo. L'intento di questa sezione è quello di chiarire questa logica, almeno in parte, in modo da facilitarne l'utilizzo in caso di necessità.
Di fatto, per Linux, non esiste in circolazione una versione originale di vi, ma tanti cloni di questo, con potenzialità più o meno ampliate. Per questo, di solito vi sarà un link (simbolico o meno) al clone che si utilizza effettivamente.
<!> Il clone vi più importante è vim che è stato portato su diversi sistemi. In particolare, la versione Dos è in grado di gestire file di dimensione molto grande (diversi Megabyte) anche su sistemi i286 con i classici 640KB.
I primi programmi di scrittura per i file di testo permettevano di visualizzare e di intervenire su una sola riga alla volta. Questo è il caso di ed per gli ambienti Unix e di edlin per il Dos.
vi è uno dei primi programmi per editing ad utilizzare tutto lo schermo per visualizzare le righe del testo su cui si opera. Da qui deriva lo stesso nome vi: VIsual.
A sua volta, vi è la derivazione di un programma precedente, ex di tipo a singola linea. Ma questa eredità è servita per incorporare i comandi tipici di ex.
vi [<opzioni>] [<file>... ]
vi può essere avviato o meno con l'indicazione di un file sul quale intervenire. Se questo file esiste, viene aperto e si ottiene la visualizzazione del suo contenuto per permetterne la modifica. Se non esiste, verrà creato.
È anche possibile l'indicazione di alcune opzioni, tra cui, le più importanti sono le seguenti.
-
R
I file vengono aperti (inizialmente) in sola lettura.
-
c <comando>
Subito dopo aver caricato il primo dei file degli argomenti, viene eseguito il comando indicato.
-
s <file-di-comandi>
Subito dopo aver caricato il primo dei file degli argomenti, vengono eseguiti i comandi contenuti nel file di comandi indicato.
Quando si avvia vi senza indicare alcun file, appare una schermata simile a quella della figura (seguente) in cui le righe dello schermo contrassegnate dal simbolo tilde (~) rappresentano lo spazio non utilizzato dal file.
Normalmente, vi può essere avviato utilizzando nomi diversi: per rispettare le tradizioni o per definire implicitamente degli attributi.
view [<opzioni>] [<file>... ]
Di solito, view è un link al clone
vi che si ha a disposizione.
Di norma, quando vi viene avviato con questo nome, si comporta
come se gli fosse stata data l'opzione -
R:
sola lettura.
ex [<opzioni>] [<file>... ]
Come già accennato, ex è il programma da cui è derivato vi. Generalmente, nelle distribuzioni Linux, si trova un link (simbolico o meno) con questo nome che punta a vi. Alcuni cloni di vi, quando sono avviati con questo nome, tendono a comportarsi in maniera leggermente differente.
vi distingue diverse modalità di funzionamento, altrimenti definibili come stati o contesti. Quando si avvia, vi si trova di solito nella modalità di comando che permette di usare determinati tasti attribuendogli significati speciali (di comando). Quando si vuole agire per inserire o modificare del testo, occorre utilizzare un comando con il quale vi passa alla modalità di inserimento e modifica.
Per complicare ulteriormente le cose, c'è da aggiungere che
esistono in realtà due tipi di comandi:
visual e colon.
I comandi visual sono i più semplici e si
compongono di brevi sequenze di uno o più tasti il cui
inserimento non appare in alcuna parte dello schermo e
si concludono senza la pressione del tasto
La modalità di inserimento si riferisce al momento in cui è
possibile modificare il testo.
Per passare dalla modalità di comando a quella di inserimento,
si preme la lettera
Per tornare alla modalità di comando, da quella di inserimento,
è sufficiente premere il tasto
Lo svantaggio principale di questo tipo di approccio è quello
di dover passare alla modalità di comando per qualunque
operazione diversa dal puro inserimento di testo.
Anche lo spostamento del cursore avviene attraverso dei
comandi, obbligando l'utente a premere il tasto
Tuttavia, i cloni più diffusi di vi addolciscono un po' il suo funzionamento introducendo l'uso dei tasti freccia nel modo consueto dei programmi di scrittura più recenti.
Per la descrizione del funzionamento di vi è importante definire il concetto di ``posizione attiva'' che si riferisce al punto in cui si trova il cursore. Estendendo il significato, si può parlare di riga attiva, colonna attiva e parola attiva, intendendo quelle su cui si trova il cursore.
Prima di affrontare i comandi di vi è importante comprendere che l'effetto di molti di questi può essere ``moltiplicato'' utilizzando un numero. Il concetto è molto semplice e si richiama alla matematica: 2a = a+a.
Come già accennato, si può inserire o modificare del testo solo quando si passa alla modalità di inserimento attraverso il comando i (insert) oppure a (append). Durante questa fase, tutti i simboli della tastiera servono per inserire del testo. Nel caso del programma vi standard si può usare:
Nel caso di cloni più sofisticati, è normalmente concesso
l'uso dei tasti freccia e in alcuni casi anche del tasto
Per tutte le altre operazioni di modifica del testo si deve passare alla modalità di comando.
I comandi a disposizione per passare alla modalità di inserimento sono molti e non si limitano quindi ai due modi appena descritti. La tabella (seguente) ne elenca alcuni.
Come già accennato, lo spostamento del cursore, e di conseguenza della posizione attiva, avviene per mezzo di comandi che generalmente obbligano a terminare la fase di inserimento. I cloni di vi più recenti permettono l'uso dei tasti freccia durante la modalità di inserimento (oltre che durante la modalità di comando), ma questo è solo un minimo aiuto: in generale è necessario tornare alla modalità di comando.
I comandi normali per lo spostamento del cursore sono le lettere h, j, k e l che rispettivamente spostano il cursore a sinistra, in basso, in alto e a destra. La ragione della scelta di queste lettere sta nella vicinanza di queste nella maggior parte delle tastiere.
Salvo casi particolari e situazioni in cui questo concetto non è ragionevolmente applicabile, i comandi di spostamento, preceduti da un numero, vengono ripetuti tante volte quante ne rappresenta quel numero. Per esempio, il comando 2h sposta il cursore a sinistra di due posizioni.
Per raggiungere una determinata riga è possibile utilizzare
il comando nG o :n
(in quest'ultimo caso, seguito da
Per esempio, per raggiungere la decima riga di un ipotetico documento si può utilizzare indifferentemente uno dei due comandi seguenti.
10G
:10
Per fare scorrere il testo di una schermata alla volta si
utilizzano le combinazioni di tasti
I comandi a disposizione per lo spostamento sono ovviamente numerosi, la tabella (seguente) ne elenca alcuni.
5w
Sposta il cursore all'inizio della quinta parola successiva.
2b
Sposta il cursore all'inizio della seconda parola precedente.
5G
Sposta il cursore all'inizio della quinta riga.
4|
Sposta il cursore sulla quarta colonna.
I comandi di spostamento, esclusi quelli che iniziano con
i due punti (:) e quelli che si ottengono per
combinazione (
All'interno di vi manca il concetto di: ``zona di intervento''. Per definire l'estensione di un comando lo si può far precedere da un moltiplicatore (un numero) e/o seguire da un comando di spostamento. Il comando di spostamento viene utilizzato in questo caso per definire una zona che va dalla posizione attiva a quella di destinazione del comando, e su questa zona interverrà il comando precedente.
Per poter applicare questo concetto, è però necessario che i comandi, da utilizzare in associazione con i modificatori (di spostamento), siano stati previsti per questo. Deve trattarsi cioè di comandi che richiedono questa ulteriore aggiunta.
Come si vedrà in seguito, il comando x permette
di cancellare quello che appare sotto al cursore.
Quando viene premuto il tasto
Si comporta diversamente il comando d che invece deve essere seguito da un modificatore e con questo definisce una zona da cancellare. Per esempio, dw cancella dalla posizione attiva fino all'inizio della prossima parola e d$ cancella dalla posizione attiva fino alla fine della riga.
Durante la fase di inserimento è possibile cancellare solo il
carattere appena scritto utilizzando il tasto
I comandi di cancellazione più importanti sono x, d seguito da un modificatore, e dd. Il primo cancella il carattere che si trova in corrispondenza della posizione attiva, cioè del cursore, il secondo cancella dalla posizione attiva fino all'estensione indicata dal modificatore e il terzo cancella tutta la riga attiva. Con vi non è possibile cancellare il carattere che conclude una riga (newline), di conseguenza, per unire due righe insieme si utilizza il comando J oppure j (bisogna provare).
5x
Ripete 5 volte la cancellazione di un carattere. In pratica, cancella 5 caratteri.
2dd
Ripete 2 volte la cancellazione di una riga. In pratica, cancella la riga attiva e quella seguente.
dw
Cancella a partire dalla posizione attiva, fino al raggiungimento della prossima parola.
2dw
Ripete per due volte il tipo di cancellazione dell'esempio precedente. In pratica cancella fino all'inizio della seconda parola.
d2w
Cancella a partire dalla posizione attiva, fino al raggiungimento della seconda parola successiva. In pratica, esegue la stessa operazione del comando 2dw.
db
Cancella a ritroso, dalla posizione corrente, fino all'inizio della prima parola che viene incontrata.
d$
Cancella a partire dalla posizione attiva, fino alla fine della riga.
d5G
Cancella dalla posizione attiva fino all'inizio della riga numero 5.
La modifica del testo inserito può avvenire attraverso i comandi di cancellazione già visti, oppure attraverso comandi di sostituzione. Generalmente si tratta di comandi che prima cancellano parte del testo e subito dopo attivano l'inserimento.
I comandi di sostituzione più importanti sono c seguito da un modificatore, e cc. Il primo sostituisce dalla posizione attiva fino all'estensione indicata dal modificatore e il secondo sostituisce tutta la riga attiva.
A fianco di questi se ne aggiungono un paio che possono essere utili proprio per il fatto che non passano alla modalità di inserimento: rx e ~. Il primo sostituisce il carattere in corrispondenza del cursore con quello rappresentato da x e il secondo inverte le lettere minuscole in maiuscole e viceversa.
cc
Sostituisce la riga attiva.
c$
Sostituisce a partire dalla posizione attiva fino alla fine della riga.
rb
Rimpiazza il carattere che si trova nella posizione attiva con la lettera b.
10~
Inverte le lettere maiuscole e minuscole a partire dalla posizione attiva, per dieci caratteri.
La gestione della copia e dello spostamento di testo attraverso vi è un po' complicata. Per questa attività si utilizzano delle memorie di transito, o buffer, alle quali si possono accodare diverse parti di testo.
L'operazione con la quale si copia una porzione di testo in un buffer viene detta yanking (estrarre) e questo giustifica l'uso della lettera y nei comandi che compiono questa funzione.
I buffer per lo spostamento o la copia di testo possono essere 27: uno per ogni lettera dell'alfabeto e uno aggiuntivo senza nome.
Il modo più semplice di gestire questo meccanismo è quello di usare il buffer senza nome. Per copiare una porzione di testo si può utilizzare il comando y seguito da un modificatore, oppure il comando yy che invece si riferisce a tutta la riga attiva. Per incollare il testo copiato, dopo aver posizionato il cursore nella posizione di destinazione, si può utilizzare il comando p oppure P, a seconda che si intenda incollare prima o dopo la posizione del cursore.
Il comandi p e P non cancellano il buffer, di conseguenza, se serve si può ripetere l'operazione di inserimento riutilizzando questi comandi.
Se invece di copiare si vuole spostare il testo, al posto di usare i comandi di yanking si possono usare quelli di cancellazione che, anche se non era stato chiarito precedentemente, prima di cancellare il testo fanno una copia nel buffer.
5yy
Copia nel buffer 5 righe a partire da quella attiva.
yw
Copia nel buffer il testo che parte dalla posizione attiva fino all'inizio della prossima parola.
y$
Copia nel buffer il testo che parte dalla posizione attiva fino alla fine della riga.
3dd
Sposta nel buffer tre righe a partire da quella attiva.
2P
Incolla due copie del testo contenuto nel buffer a partire dalla posizione a sinistra del cursore.
Quando si vogliono utilizzare dei buffer specifici, cioè identificati attraverso le lettere dell'alfabeto, si procede nei modi già visti nel caso dell'uso del buffer senza nome, con la differenza che i comandi sono preceduti da "x, dove x è la lettera che si vuole usare.
Si introduce però una novità importante: è possibile aggiungere del testo a un buffer: basta indicare il buffer attraverso una lettera maiuscola.
"adw
Sposta il testo nel buffer a a partire dalla posizione attiva fino all'inizio della prossima parola.
"a5yy
Copia 5 righe nel buffer a a partire dalla posizione attiva (inclusa).
"A3yy
Aggiunge 3 righe nel buffer a a partire dalla posizione attiva (inclusa).
"a2P
Incolla due copie del contenuto del buffer a a partire dalla posizione precedente a quella su cui si trova il cursore.
Per effettuare delle ricerche all'interno del documento aperto con vi si possono utilizzare le espressioni regolari (appendice `Espressioni regolari') attraverso due comandi un po' strani: / e ?. La sintassi per la ricerca in avanti è
/<modello>
mentre per la ricerca a ritroso è la seguente.
?<modello>
Nel momento in cui si preme la barra o il punto interrogativo, vi visualizza
il comando nella riga inferiore dello schermo permettendone il controllo e la
correzione come avviene per i comandi colon (cioè quelli che iniziano con i due
punti).
Al termine, l'inserimento di questo tipo di comando deve essere concluso con un
Il tipo di espressione regolare che può essere utilizzato con vi è solo quello elementare e valgono in particolare le regole indicate nella tabella (seguente).
La ricerca e sostituzione sistematica avviene attraverso un comando colon particolare. La sua sintassi è la seguente.
:<inizio>,<fine>s/<modello-da-cercare>/<sostituzione>/[g][c]
L'indicazione <inizio> e <fine> fa riferimento alle righe su cui intervenire. Si possono indicare dei numeri, oppure dei simboli con funzioni simili. Il simbolo $ può essere usato per indicare l'ultima riga del file. Un singolo punto (.) rappresenta la riga attiva. Il simbolo % viene invece utilizzato da solo per indicare tutte le righe del file.
Il modello utilizzato per la ricerca viene espresso secondo la forma delle espressioni regolari.
Il valore da sostituire al modello cercato è normalmente fisso, ma può contenere un riferimento alla stringa trovata, attraverso il simbolo &.
La direttiva g specifica che si deve intervenire su tutte le occorrenze della corrispondenza con il modello, altrimenti la sostituzione riguarda solo la prima di queste.
La direttiva c specifica che ogni sostituzione deve essere espressamente confermata.
:1,$s/pippo/pappa/g
Sostituisce ogni occorrenza della parola pippo con la parola pappa. La ricerca viene effettuata a partire dalla prima riga fino all'ultima.
:%s/pippo/pappa/g
Questo è un modo alternativo per eseguire la stessa operazione dell'esempio precedente: il simbolo % rappresenta da solo tutte le righe del file.
:.,10s/^..//g
Elimina i primi due caratteri (^..) da dieci righe a partire da quella attiva.
:%s/^..//gc
Esegue la stessa operazione dell'esempio precedente, applicando la sostituzione su tutto il file, richiedendo però conferma per ogni sostituzione.
:.,10s/^/xxxx&/g
Inserisce la stringa xxxx all'inizio di dieci righe a partire da quella attiva.
vi permette di annullare l'ultimo comando inserito attraverso il comando u. A seconda del tipo di clone utilizzato, richiamando nuovamente il comando u si riottengono le modifiche precedentemente annullate oppure si continuano ad annullare gli effetti dei comandi precedenti.
Comando | Descrizione |
u | Annulla l'ultimo comando. |
U | Annulla le modifiche sulla riga attiva. |
Il file o i file utilizzati per l'editing vengono normalmente aperti attraverso l'indicazione nella riga di comando, al momento dell'avvio di vi.
Il salvataggio di un file può essere fatto per mezzo del comando :w (Write) eventualmente seguito dal nome del file (quando si vuole salvare con un nome diverso oppure quando si sta creando un nuovo file).
La conclusione dell'attività di vi si ottiene con il comando :q
I comandi possono essere combinati tra loro, per esempio quando di vuole salvare e concludere la attività simultaneamente con il comando :wq.
Il punto esclamativo (!) può essere usato alla fine di questi comandi per forzare le situazioni, come quando si vuole concludere l'attività senza salvare con il comando :q!.
Dal momento che vi non mostra normalmente alcuna
informazione sul file su cui si opera (compreso il nome),
il comando :f (oppure la combinazione
vi ha ereditato dal programma ex delle variabili di configurazione. Per attivare una variabile si utilizza il comando seguente
:set [no]<nome-della-variabile>
Il prefisso no, prima del nome della variabile, serve per disattivarla.
La tabella (seguente) mostra l'elenco di alcune di queste variabili.
:set nolist
Disabilita la visualizzazione dei caratteri di tabulazione e di fine riga.
:set number
Visualizza i numeri di riga.
Di seguito sono elencati una serie di comandi particolari che non sono stati inclusi nelle categorie precedenti.
---------
mx
Etichetta la posizione corrente con la lettera rappresentata da x. Valgono solo le lettere minuscole. Il testo non viene modificato.
'
x
Sposta il cursore all'inizio della riga che contiene l'etichetta rappresentata da x.
Riscrive la schermata: se sono apparsi messaggi che possono dare fastidio alle operazioni di editing, questo comando permette di farli scomparire mostrando il testo effettivo del file sul quale si sta lavorando.
:!<comando>
Esegue il comando di shell indicato.
:ab <abbreviazione> <testo-da-sostituire>
Permette di stabilire una abbreviazione che verrà sistematicamente sostituita con tutto quello che segue il comando. Se si usa :ab da solo, si ottiene un elenco delle abbreviazioni disponibili.
Può essere utilizzato il file ~/.exrc per personalizzare la configurazione di vi attraverso comandi colon (quelli tipici di ex). Le cose più comuni che appariranno all'interno di questo file saranno la definizione di abbreviazioni e la definizione di alcune variabili. Segue un esempio.
:ab lx Linux
:ab xwin X Window System
:set autoindent
:set number
Uno dei vantaggi importanti nell'uso di vi sta nella disponibilità di cloni di questo programma per qualsiasi piattaforma. All'inizio di questo gruppo di sezioni su vi si accennava al fatto che esiste una ottima versione Dos in grado di funzionare molto bene anche con i vecchi computer dotati di poca memoria.
Quando si trasferiscono testi da un sistema Linux a Dos e viceversa si pone il problema del set di caratteri a disposizione: su Linux si utilizza presumibilmente la codifica Latin-1, mentre con il Dos no.
La soluzione più semplice a questo problema è probabilmente quella di usare Latin-1 in
generale e di convertire le lettere accentate Dos in Latin-1 quando possibile.
Per questo è possibile realizzare un semplice file di comandi da eseguire automaticamente
utilizzando l'opzione -
s.
Le sigle ~E, ~J, ecc. rappresentano le lettere accentate della codifica utilizzata nei sistemi Dos. Per scrivere un file del genere, occorrono due fasi: una in un ambiente che accetti la codifica Latin-1 e l'altra in Dos.
:1,$s/~E/à/g
:1,$s/~J/è/g
:1,$s/~B/é/g
:1,$s/~M/ì/g
:1,$s/~U/ò/g
:1,$s/~W/ù/g
In pratica, la sintassi da usare all'avvio di vi dovrebbe essere la seguente.
vi
-
s <file-comandi> <file-da-elaborare>
1997.10.26 - Scritto da Daniele Giacomini daniele@calion.com (vedi copyright: Appunti Linux).