martedì 13 agosto 2013

Termimecum #05
File.1 - L'editor 'VIM'



TM#05@File.1_VIM
Un editor di testo usabile direttamente da terminale è uno strumento utile - a volte indispensabile - per l'editing di file (soprattutto di configurazione) in modo semplice e rapido senza "abbandonare" la console.
Tra i più famosi c'è 'VIM', che merita qualche accenno d'uso perchè ha un impatto molto ostico, ma con un minimo di fiducia diventerà un vostro grande amico ;)


File allegato: @end_of_post


Se parliamo di editor "storici", famosi per versatilità, leggerezza e non di meno per un buon grado di nerd-friendly (:P), a me ne vengono in mente subito tre:
  1. Emacs: pagina Wiki e sito principale
  2. VI(M): pagina Wiki e sito principale
  3. nano: pagina Wiki e sito principale
disposti in ordine di "anzianità".
Se le loro caratteristiche sostanziali, quelle che li hanno resi così utili, utilizzati ed apprezzati, sono la leggerezza e la flessibilità, è anche vero che invece la caratteristica che salta subito all'occhio del nuovo utente è la capacità di scatenare una paura atavica e un rifiuto a prescindere.

Cercherò allora di illustrare l'uso basilare di 'VIM', essendo questo l'editor più grezzo dei tre, quindi il più "bisognoso" di esplicitazione.
E poi è il mio preferito :P


  • Breve panoramica 
Già che ci sono, per la vostra (in)felicità, spendo qualche parola a proposito dello "scenario text-editor" vintage.
Ah, specifico che le considerazioni di seguito sono tutte personali, per quanto voglia essere oggettivo alla fine mi baso sul mio gusto e le mie esigenze; tra questi tre editor (e altri), o meglio, tra i loro sostenitori, è scoppiata una "guerra" che, a colpi di polemiche e frecciatine, si fa sentire ancora oggi. Io non c'entro nulla e non voglio entrarci per niente! :P

Emacs è il primo nato tra questi tre. E' stato programmato da Stallmann in persona, ed è ancora oggi sviluppato e sostenuto dalla Free Software Foundation (FSF per gli amici :D).
Paradossalmente, è però l'unico che nasce con interfaccia grafica e così vi si presenta quando lo lanciate. Ha tutta una serie di combinazioni di tasti per fare un mucchio di cose (anticamente, nell'epoca pre-mouse, così funzionava), caratteristica apprezzata da chi è abituato a shortcuttare pesante, ma IMHO non così indispensabile per chi è più avvezzo al mouse - anche se i tasti di scelta rapida hanno il loro senso sicuramente.

VIM nacque come "Vi" (abbreviazione del comando 'visual'), al quale venne aggiunta la 'M' per diventare l'acronimo di 'Vi IMproved'.
E' un editor pesantemente modale, ovvero differenzia le sue possibilità in base alla modalità (di interfaccia e di lavoro) nella quale si trova (spiegazione più avanti). Fornisce eventualmente anche un'interfaccia grafica.

nano è il più giovane; questo ne porta benefici, come ad esempio il "menù" visuale, sempre in primo piano, che consente un utilizzo (base) più semplice di 'Vi' pur rimanendo in ambito totalmente terminale.
E' l'editor non grafico installato di base in tutte (credo) le Debian-derivate. Questo ne fa un ottima scelta, avendo forti possibilità - se vi trovate spesso a lavorare su macchine a voi "straniere" - di ritrovarvelo "fra i piedi". Può fornire anche questo un'interfaccia grafica -  a mio gusto la peggiore delle tre, confusionaria.
Tuttavia, proprio grazie al suo pseudo-menù, nelle funzioni base si illustra da solo e non necessità di un'introduzione all'uso.


  • Perchè 'VIM'
Ovviamente le risposte <<Perchè no?>> e <<Ognuno faccia come meglio si trova>> sono sempre le più valide. :P
Ora però provo a fornire qualche motivazione in più...

'VIM' risponde alla necessità di avere un editor in-line, leggero e flessibile, per rapide letture e piccole e semplici modifiche. Uno strumento che sia possibile utilizzare completamente su console e che ottimizzi il compromesso tra questa modalità d'uso e l'usabilità degli editor grafici.

Quali vantaggi può portare l'uso di un editor di questo tipo, quando in interfaccia grafica anche editor poco complessi (il primo che mi sovviene: Geany)  risultano più semplici ed immediati?
Perchè il fatto che appaiano più "immediati" deriva dal contesto: ovvero, quello grafico. Ma se ci troviamo ad operare da terminale, risulta molto più "immediato" un editor che ci consenta di non uscire da tale ambito. Soprattutto tenendo conto del fatto che, solitamente, le necessità di editing quando si opera da terminale sono inerenti a file di configurazione o piccoli script, quindi soprattutto "prese visioni" rapide e/o piccole modifiche (valori di setting, commentare/decommentare qualche riga, aggiungere in cima o in fondo un comando o un'impostazione solitamente di pochi caratteri); esigenza che come detto corrisponde perfettamente al "target principe" delle funzionalità di VIM.
Inoltre, cosa non da poco, può succedere che non si abbia altra scelta. Ad esempio, in caso di impallamento dell'interfaccia grafica, se ci troviamo in una sessione virtuale "alternativa" (ricordate quanto detto a proposito della combinazione [CTRL]+[ALT]+[Fn]?); oppure, se stiamo impostando una configurazione critica o un aggiornamento sensibile, ed abbiamo preso login direttamente da shell e da lì vogliamo operare; o ancora (ma in questo caso, probabilmente ne sapete più di me) se si sta "operando" su terminali... altri... ;)

Perchè non Emacs?
Perchè è grafico e, pur avendo alcuni "requisiti" tra quelli che mi sono pensato, non rientra appieno nella "categoria".

Perchè non nano?
Perchè lo trovo, paradossalmente, meno immediato, in quanto meno essenziale. Probabilmente solo una questione di abitudine; ma, oggettivamente, avendo il suo pseudo-menù, negli utilizzi base (quelli a cui mi riferisco fin dall'inizio), non avrebbe in ogni caso bisogno di spiegazione ^^

Infine, per quanto possa interessare, 'VIM' è disponibile su sistemi Unix e *nix-like (ovviamente!), su MS-DOS e Win32, su OS/2 e, chicca per nostalgici, udite udite su Amiga!


  • Il comando ed i programmi
Vediamo la sintassi - le parti essenziali, in spirito 'Termimecum' - del comando:

(f07) $ vim [OPZIONI] [PATHFILE1 & PATHFILE2 & ...]

Il modo più semplice di lanciare il programma è quello di digitare
vim <nomefile>
Se il file non esiste, viene creato; se si scrive semplicemente 'vim', si apre l'editor con un buffer vuoto; il nome (ed eventuale percorso) del file verrà chiesto al momento del primo salvataggio. Per quel che concerne le opzioni, sono molteplici; ne esamino qualcuno nello schema seguente, ma vi ricordo che, come sempre, la cosa migliore è ricorrere a 'man'...

----8<--pre-cut-start--8<------------------------------------------------------------

[ OPZIONI ]
#opz            #type           #use
-b              binario         editing di eseguibili
-e              modo ex         modalità 'ex'
-E              modo exim       modalità 'ex improved'
-d              differenze      evidenzia le differenze (richiede più PATHFILE)
-g              GUI             interfaccia grafica (se installata)
-h              help            elenca alcune opzioni e comandi base
-nb             netbeans        diventa editor-server per NetBeans
-o[N]           split or.       apre "N" finestre orizzontalmente
-O[N]           split ver.      apre "N" finestre verticalmente
-R              read-only       non permette modifiche
-V              verbose         manda informazioni sui file di scripting che legge
-x              cifratura       cifra il file editato (necessita di chiave)
 
----8<--end--8<----------------------------------------------------------------------

Come potete vedere dalla sintassi, 'VIM' permette di aprire più file contemporaneamente. Questo consente sia un editing "seriale", andando ad editare questi file in sequenza, sia un editing "differenziale" (opzione '-d'), sia un editing multitesto (opzioni '-o' e '-O'). In particolare, con le opzioni di split è possibile aprire finestre a piacere, attraverso il parametro 'N', oppure non specificare nulla, lasciando che l'editor apra tante finestre quanti sono i file.

Avrete notato (spero :P) che nel titolo ho parlato di programmi. Perchè?
Come detto in precedenza 'VIM' possiede diverse modalità, che io ho suddiviso in modalità d'interfaccia e modalità di lavoro. Le modalità d'interfaccia sono fornite attraverso alcuni "sotto-programmi", che possono (eventualmente) anche essere richiamati autonomamente. Se notate, nella lista delle opzioni si notano alcune di queste modalità.
Di seguito uno schemino per riassumerle...

----8<--pre-cut-start--8<------------------------------------------------------------

[ VERSIONI ]
#prog                   #modo                           #opzione corrispondente
vim                     normale (default)
ex                      ex                              -e
exim                    ex migliorato                   -E
view                    read-only                       -R
g{vim|view}             GUI                             -g
e{vim|view}             semplificato                    -y
 
----8<--end--8<----------------------------------------------------------------------

Alcune modalità (come quella grafica) sono utilizzabili solo se il programma 'vim' è stato compilato con l'abilitazione relativa.
Su Linux Mint (come credo anche sulle *ubuntu) il pacchetto base non è compilato in quel modo; si rende quindi necessaria l'installazione separata del programma 'gvim' (o gview per la versione sola lettura). Una volta installato, viene invocato automaticamente anche attraverso l'opzione '-g'.
Che te ne fai di un'interfaccia grafica se hai appena detto che è un programma valido per l'editing da console? Niente, l'ho installata solo per provarla :P

Comunque la modalità più usata (e più usabile e sensata) è quella classica di default - anche perchè, volendo, da questa si può passare alle altre. Quindi in questa "guida" mi riferisco sempre a questa.


  • Modalità di lavoro
Le modalità di lavoro, disponibili anche nelle altre interfacce (tranne la modalità 'insert' che nell'interfaccia 'read-only' è per ovvi motivi disabilitata), sono essenzialmente tre:
  1. edit
  2. insert
  3. command
Un piccolo schemino dei tasti per accedere alle modalità, che si chiarirà con la spiegazione successiva; in funzione "generale", fornisco qui anche i tasti per le possibilità di 'undone' e 'repeat', che si riveleranno utili, comode e alle volte "salvavita" ;)

----8<--pre-cut-start--8<------------------------------------------------------------

[ SWITCH ]
i               insert
INS             insert
:               command
v               visual char
V               visual line
CTRL+v          visual block
ESC             edit (default)



[ HISTORY ]   
.               ripeti comando (di editing)
u               annulla comando/i

----8<--end--8<----------------------------------------------------------------------


  • Edit
La modalità con la quale si presenta il programma e dalla quale si possono raggiungere le altre modalità di lavoro; vi si ritorna premendo il tasto [ESC].
In questa modalità è possibile spostarsi all'interno del testo usando le frecce (una volta dalla modalità 'insert' non era possibile, credo sia per questo motivo "storico" che la modalità di riferimento è ancora questa), operare modifiche di taglia, copia e incolla e piccoli inserimenti/cancellazioni di testo, oltre che ricerche.
Da qui si può anche accedere alla sotto-modalità 'visual'. Comodissima, consente la selezione (di tipo carattere, linea o blocco) per l'editing rapido.

----8<--pre-cut-start--8<------------------------------------------------------------

[ POSIZIONE ]  
FRECCE          spostamento
PG-UP           su di una pagina
PG-DW           giù di una pagina
gg              inizio file
G               fine file
0               inizio riga
$               fine riga
<n>gg           riga numero "n"
H               inzio schermata
L               fine schermata
M               centro schermata



[ RICERCA ]   
*               cerca la parola su cui è posizionato il cursore 
/<w>            cerca la occorrenza "w"
/UP             ricerca precedente
/DOWN           ricerca successiva
n               occorrenza successiva



[ MODIFICA ]  

#cancellare (tagliare)
        <n>dd           cancella "n" linee
        <n>dw           cancella "n" parole
        d$              cancella fino a fine riga
        d0              cancella fino a inizio riga
        <n>x            cancella "n" caratteri

#sostituire
        <n>r<c>         rimpiazza "n" caratteri con "c"

#copiare
        <n>yy           copia "n" linee
        <n>yw           copia "n" parole
        y$              copia fino a fine riga
        y0              copia fino a inizio riga

#incollare
        <n>p            incolla "n" volte successivamente
        <n>P            incolla "n" volte precedentemente

#varie
        <n>~            inverte il case per "n" caratteri successivi
        ZZ              salva ed esce



[ VISUAL-EDITING ]
d               cancella
y               copia
~               case-invert
 
----8<--end--8<----------------------------------------------------------------------

Lo so che può sembrare tutto molto complicato. Vi assicuro che, in realtà, si tratta solo di usare i comandi un paio di volte e poi diventa molto più semplice da usare che da spiegare.
Pongo l'accento solo su alcune cose. Per esempio, "cancellare" significa sempre "tagliare", per cui quello che cancellate lo avete nel buffer di memoria finchè non lo sovrascrivete.
Avrete poi notato che vi sono alcune congruenze. Ad esempio, '0' e '$' indicano fine e inizio riga sia nel posizionamento, che nella copia che nella cancellazione; di concerto, le lettere 'd' (-d-elete) e 'y' (cop-y-) son come dei veri e propri comandi; anche il "prefisso numerico" ('<n>') funziona sempre allo stesso modo, se omesso il comando dato vale per una singola "unità" (riga, carattere, ecc...).

Il visual-editing consente di selezionare il testo più comodamente. Se vi entriamo con 'v' possiamo selezionare un carattere alla volta, con 'V' riga per riga e infine con la combinazione 'CTRL-v' un blocco per volta, ovvero una colonna di testo - risulta utile soprattutto in testi tabellari, come lo schema qui sopra ad esempio.
Una volta operata la selezione desiderata, possiamo cancellare, copiare, invertire il case. Sono possibili altre modifiche più avanzate, ma rimando al comando ':help' per approfondimenti.

Anche se questa modalità può apparire arcaica ed inutile, vi assicuro che non è così. All'inizio, anche io appena aperto il file entravo in modalità 'insert' (che come vedremo, è quella di editing "classico"); poi ho capito che questo modo mi sembrava inutile perchè non lo usavo, appena ho preso un po' di confidenza ne ho capito la vera utilità.
A maggior ragione, per il fatto che spesso le modifiche da effettuare sono minime - tipo cambiare un valore booleano o commentare/de-commentare una linea - e possono essere svolte direttamente da qui, rendendo il lavoro rapido e "snello".


  • Insert
Su questa modalità non c'è molto da dire, è il modo di editare il file al quale le interfacce grafiche ci hanno abituato. Vi si accede premendo 'i', oppure il tasto [INS], o ancora il tasto 'I' che differisce da 'i' solo perchè posiziona a inizio riga a prescindere da dove sia il cursore nel momento in cui si preme.
Si può "navigare" all'interno del testo normalmente - la normalità degli editor in-line, quindi non nella parti "vuote", su linee o parti non contenenti testo o caratteri di ritorno - e si può scrivere.
Tuttavia, per usufruire delle funzioni di buffer (come il copia-incolla) o accedere alla modalità 'comando' (che vedremo) è necessario uscire e tornare al modo 'edit', premendo come detto il tasto [ESC].


  • Command
Questa modalità serve per operare sul/sui file/s (salvare, rinominare, ecc...) e per agire sulle impostazioni del programma. Bisogna anteporre ':' a ciò che si scrive affinchè sia considerato un comando; la modalità termina automaticamente nel momento in cui si preme [ENTER] e il comando (se corretto) viene eseguito.
Infatti nello schema i comandi "puri" sono tutti preceduti dai due punti, mentre quelle che ho chiamato 'opzioni' vengono indicate senza, in quanto sono sia comandi interni - in quel caso, come tutti i comandi devono essere preceduti dai due punti - che, appunto, opzioni da poter aggiunger nei file di configurazione (che vediamo appena dopo).

----8<--pre-cut-start--8<------------------------------------------------------------

[ COMANDI UTILI ]
:f              informazioni file
:f <f>          rinomina il file attuale in "f"
:sh             sezione console
:<n>            posiziona sulla riga numero "n"
:number         visualizza il numero della linea corrente
:w              salva
:w <f>          salva con nome "f"
:r <f>          inserisce il contenuto di "f" nella posizione del cursore
:e <f>          chiude il file attuale, apre e visualizza il file "f"
:q              esce
:q!             forza uscita senza salvare
:x              salva ed esce
:wq             salva ed esce
:help           guida in linea



[ OPZIONI ]   
set number      visualizza numeri di linea
set nonumber    nasconde numeri di linea
set showcmd     mostra comandi parziali (in EDIT mode)
set mouse=a     abilita il mouse
set hlsearch    abilita evidenziazione colorata per la ricerca
set nohlsearch  disabilita evidenziazione per la ricerca

----8<--end--8<----------------------------------------------------------------------


Vediamo un paio di comandi e poi spieghiamo la cosa delle "opzioni".
':f' ci ricorda nome e percorso del file, ci consente di capire se, da quando è stato aperto, il file è stato modificato e a che punto siamo del testo (linee totali, percentuale di posizione).
':sh' ritorna alla console, "sospendendo" temporaneamente l'editor; una volta eseguito il nostro compito, col consueto 'exit' torneremo a 'VIM'.
':r <f>' in pratica esegue il merge di due file.
In generale, il carattere '!' forza l'uscita senza salvare le modifiche.
All'interno della modalità comando è possibile usufruire di una history come per il terminale, da scorrere con [UP] e [DOWN].

Tenete infine presente che l'aiuto in linea, visualizzabile con ':help' è composto da molti file di testo linkati attraverso dei 'tag' (una funzione avanzata che non rientra negli scopi di questa guida).
In poche parole, dateci un'occhiata!


  • File inerenti ed opzioni
'VIM' possiede numerosi file, con varie funzioni: guide, esaminatori di sintassi, configurazione, ecc...
Al solito consiglio di dare un'occhiata al man per approfondire. Qui lascio perdere la colorazione della sintassi e gli scripting, nomino le configurazioni e le guide.

'$HOME/.viminfo' contiene l'history del buffer e dei comandi; molto utile se si vuole recuperare qualcosa di "desaparesidos" XD
'etc/vim/vimrc' è il file di configurazione delle opzioni. In questo file potete scrivere le opzioni di comando come sono riportate (senza i due punti quindi), che verranno quindi usate come default all'avvio dell'editor. La sua modifica richiede i privilegi di amministratore.
'$HOME/.vimrc' è un file che dovrete creare, se volete che le vostre opzioni siano davvero solo vostre (mentre nel file precedente le modifiche ricadono su tutti gli utenti); quindi utile solo in caso di sistema realmente multiutente.
'/usr/share/vim/vim73/doc/*.txt' questi sono i file che contengono il manuale; potete leggerli come file indipendenti, oppure attraverso il comando ':help' dell'editor - come detto, in questo secondo caso saranno integrati come un ipertesto.

Le opzioni nello schema sopra sono solo alcune di quelle disponibili, quelle che mi sembrano più utili ed intuitive.
Se date un'occhiata al file di configurazione, vedrete che vi sono già inserite molte opzioni sotto commento; per abilitarle, basterà de-commentare la riga corrispondente.


  • Conclusioni ed allegato
Se lo scopo di questa guida era quello di invogliare il lettore a provare 'VIM', credo di aver miseramente fallito. Infatti, mettendo le cose "nero su bianco", sembra tutto davvero molto complicato ed arcaico.
In realtà, l'ho già detto ma devo ripeterlo, perchè assolutamente vero, se date fiducia a questo "programmino", in breve capirete che è davvero più difficile leggere tutte queste righe che usare (ed apprezzare) questo editor.

Sperando di fare cosa gradita, ma soprattutto utile - per me lo è - ho creato un paste bin tipo "vademecum", che riporta gli schemi qui proposti e poco più.
In formato di testo semplice (seppur ho usato una sorta di sintassi stile file di configurazione), ve lo potete copia-incollare come meglio credete.

PasteBin: vim-miniman


Nessun commento:

Posta un commento