Vim
Posted: Dicembre 10th, 2007 | Author: packz | Filed under: Guide, Programmazione | 1 Comment »Vi Vi Vi the editor of the beast
Nel 1976 nasce per mano di Bill Joy quello che diventerà l’editor per eccellenza degli hacker negli anni a venire, il mitico Vi: nome derivato dalle iniziali del comando visual prende vita dall’editor ex, editor ancora precedente a sua volta derivato da ed.
Prima di tutto bisogna comprendere che non si ha di fronte un editor comune, ma un editor che ha una eredità (pesante) derivante dai vecchi sistemi: esitono tre modalità principali in cui questo programma può operare
- Comandi
- Visuale
- Inserimento/Sostituzione
ognuna di queste ha una propria missione da compiere e il suo preciso scopo per operare, benché condividano delle funzionalità in comune.
Inserimento
È la modalità che più si avvicina ad un normale editor: alla base del terminale è presente la scritta "— INSERISCI —" che indica all’utente che si può procedere all’inserimento del testo desiderato; alternativo a questa modalità è la sostituzione (troverete il termine "— SOSTITUISCI —" alla base del terminale) che si ottiene dalla modalità di inserimento una volta premuto il tasto [Ins]. Ma non abbiamo ancora detto come si attiva questa modalità e perciò ecco l’elenco
i – attiva la modalità inserimento nel punto in cui è il cursore
I – attiva la modalità inserimento portando il cursore ad inizio linea
a – attiva la modalità inserimento nel carattere dopo il cursore
A – attiva la modalità inserimento a fine linea
o – crea una riga vuota (superiormente alla posizione del cursore [W l’italiano]) e attiva la modalità inserimento
O – come il precedente ma la riga è quella superiore
ea – inizia la modalità di inserimento alla fine della parola su cui è il cursore
Visuale
In linea di massima questa modalità sostituisce il possibile utilizzo del mouse nell’evidenziare zone di testo su cui eventualmente effettuare delle operazioni; le varie possibilità per attivarlo sono
v – attiva la modalità visuale
V – attiva la modalità visuale a linee
[Esc] – disattiva la modalità
a cui vanno aggiunte particolari combinazioni da richiamare per comuni parti di testo
aw – marca una parola
ab – marca il contenuto fra parentesi tonde (comprese le parentesi)
aB – marca il contenuto fra parentesi graffe (comprese le parentesi)
ib – marca il contenuto interno fra tonde (i = inner)
iB – marca il contenuto interno fra graffe
U – cambia in uppercase il testo evidenziato
Comandi
Andiamo in giro
Una delle cose più utili in Vim è la possibilità di poter cercare occorrenze di determinati caratteri, parole, funzioni etc…
- gd – porta nel punto in cui è definita la variabile locale su cui siete con il cursore
- % – se sopra una parentesi vi porta dalla sua compagna
- * – porta alla prossima occorrenza della parola su cui siete
- # – come prima, ma alla occorrenza precedente
- ” – ritorna da dove si era partiti per la ricerca
oltre che eventualmente effettuare delle operazioni tramite essi
- gf – apre il file il cui nome si trova sotto il cursore
- ga – mostra il valore esadecimale, ottale e ascii del carattere sotto il cursore
Poi ovviamente internamente ha un potente motore di regular expression che differisce leggermente da quello standard
. qualunque carattere
s spazio
d cifra
x cifra esadecimale
o cifra ottale
p carattere stampabile
w word character
a alphabetic character
l lowercase character
u uppercase characterle corrispondenti versioni maiuscole indicano il complementare
È possibile evidenziare i valori ottenuti con la ricerca tramite :set hlsearch (o de-impostarlo tramite :set nohlsearch)
Editiamo
Cosa sarebbe un editor senza la possibilità di editare?
- ‘. – Salta all’ultima riga modificata
- `. – Salta nell’esatto punto della modifica
- g; – Cicla attraverso i cambi avvenuti di recente
- g, – Come prima ma in ordine inverso
- :changes – Mostra la lista dei cambiamenti
Impostazioni
Esistono un gran numero di grandezze interne che regolano il comportamento di Vim durante l’editing dei file, dalla possibilità di mostrare i caratteri speciali, del numero di spazi corrispondenti al <Tab> etc
- shiftwidth
- wrapmargin
- list – mostra i caratteri invisibili nel file
- expandtab
tutte queste sono impostabili tramite il comando nella forma :set <variabile>=<valore> e deimpostabili tramite la forma :set no<variabile>.
Tab
Mica penserete che solo firefox possiede i cosidetti Tab? anche quella brutta bestia di Vim possiede (da non molto a dire la verità) di questa funzionalità che permette di adoperare più finestre contemporaneamente, però al contrario dei comandi ~split qui possiamo avere le finestre in tutta la loro larghezza. Una volta all’interno dell’editor è sufficiente dare il comando :tabnew per ottenere una nuova finestra, in aggiunta, ovviamente a quella già presente; notare la prima riga che tramite una interfaccia penso generata con le Ncurses, simula un tab
Nel caso in cui si vogliano aprire direttamente all’avvio più file, usando un tab per ognuno, è di usare l’opzione -p.
Ovviamente non ci si ferma qui, è possibile spostarsi tra i tab o con il comando :tabNext oppure con un semplice Ctrl-PgUp, Ctrl-PgDown, proprio come i Tab del terminale di Gnome (questo risulta un problema in quanto la combinazione di tasti viene grabbata dal terminale e quindi non potete usarla in vim); non ultima la combinazione gt o gT. È possibile spostare fisicamente i tabs tramite :tabmove ed indicando un numero che indica la posizione dopo la quale lo si intende posizionare; indicando 0 lo si posiziona al primo posto, senza indicare un numero lo si posiziona come ultimo.
È possibile eseguire comandi di ricerca/sostituzione stringhe in ogni tab eseguendo :tabdo <cmd>; nel caso avvenga un errore in uno dei tab il processo si ferma.
È disponibile un elenco dei tab tramite comano :tabs.
Programmare
Questo editor sembra scarno a prima vista, ma per un programmatore può essere fondamentale a causa della sua leggerezza e delle sua flessibilità:
Si può richiamare direttamente il programma per gestire la compilazione (o qual’altra azione volete intraprendere sul vostro codice) tramite
:make
che richiama di default proprio il programma make tuttavia è possibile poter impostare un qualsiasia altro programma tramite la variabile makeprg; siccome spesso l’azione da eseguire non va a buon fine, è utile poter localizzare l’output di errore e riindirizzare l’editor nostro amato sulla linea maligna e per questo esiste la variabile errorformat, che nel caso di gcc è nella forma %f:%l:%m ma voi evidentemente potete settarla come vi aggrada (vedi :h errorformat). Molto utile è la possibilità di fargli salvare in automatico tutti i buffer modificati prima di avviare la compilazione attraverso l’opzione autowrite. Inoltre è possibile effettuare queste operazioni (ce ne sono altre) con la lista di errori
- :cn va al prossio errore
- :cp va al precedente
- :cl elenca gli errori
- :cc[!] [numero] salta al’errore numero e se questo è omesso, ripete l’ultimo errore (il punto esclamativo dovrebbe non farti saltare di buffer, o almeno penso)
Esistono poi tutta una serie di funzionalità legate ai singoli linguaggi di programmazione quali il C: insieme a Vim si ha di solito abbinato un bel programmino chiamato ctags che prende come argomento dei file e restituisce un file tags in cui sono inserite
macro definite tramite #define
definizioni di funzioni,
prototipi, and dichiarazioni
classi, enum, struct, e union
namespaces
typedefs
variabili
(definizioni and dichiarazioni)
membri di classi, structs, e unions
L’utilità consta nel fatto che una volta prodotto questo file potete aprire direttamente il file dove è definita una tra le grandezze appena elencata tramite vim -t quello_che_vuoi, oppure, una volta dentro l’editor basta posizionarsi su una variabile, su una funzione e poi premere Ctrl – ] per essere spediti direttamente sulla sua definizione (basta premere Ctrl -t per tornare al punto di partenza). Nel caso si voglia cercare una definizione non sotto mano basta dare :ta quell_che_vuoi.
- :ts[elect][!] [ident] Visualizza tutte corrispondono a ident
- :sts[elect][!] [ident] Visualizza tutte corrispondono a ident ma splitta in una nuova finestra
Un’altra funzionalità molto utile è la possibilità di richiamare le pagine di manuale direttamente usando in modalità comando il tasto "K" che richiama quanto contenuto nella variabile keywordprg (o la sua abbreviata kp); di default è impostato con "man". Cioé in questo caso mostra la pagina di manuale relativamente alla parola su cui si è con il cursore (è possibile selezionare la sezione della pagina di manuale premendo prima il numero della sezione).
Modeline
Esiste la possibilità di impostare in automatico certe variabili all’apertura di un file tramite la modeline: ponendo nelle prime o nelle ultime 5 righe una istruzione del tipo
[text]{white}{vi:|vim:|ex:}[white]{options}
[text] qualunque testo o anche niente
{white} almeno un carattere "bianco" (<Spazio> o <Tab>)
[white] spazio bianco opzionale
{options} lista di impostazioni separate con spazi bianchi oppure dal carattere ‘:’; ognuna delle parti separate con ‘:’
deve essere l’argomento di un comando set.
Questo è particolamente utile nel caso editiate file in progetti non vostri che usano delle impostazioni negli spazi, i tab e indentazioni non standard; per esempio per fare in maniera che un file venga aperto con uno shiftwidth pari a 4 quando voi in realtà lo usate con un valore pari ad 8 ponete la riga
/* vi: shiftwidth=4: */
entro le prime 5 righe del file o nelle ultime 5.
Siccome questa feature ha delle problematiche di sicurezza, gli utenti Debian devono commentare nel file /usr/share/vimcurrent/debian.vim la riga set nomodeline.
Curiosità
Il fatto che vengano usate le lettere hjkl per i movimenti del cursore derivano dal fatto che il programma originariamente fu sviluppato su un terminale Lear-Siegler ADM3A avente il seguente schema di tastiera
e come potete notare sono presenti delle frecce sui suddetti tasti.
Linkografia
- Vim cheat sheet
- Vim e le regular expressions (link)
- Vim e i tabs in un articolo su linux.com
- Screencast riguardanti Vim (in inglese of course)
Un post da incorniciare!
W vi