Finalmente è arrivata la mia copia di
Hacking ViM!
La sola visione della copertina mi ha ispirato questo post, in cui voglio descrivere come utilizzo le funzionalità di ViM 7 per gestire l'editing contemporaneo di più file, ovvero split windows e tab.
Come prima cosa, sarà introdotta la funzionalità di mapping di ViM.
Successivamente sarà descritta prima la modalità
tradizionale di utilizzo di queste caratteristiche, e successivamente alcune agevolazioni e binding che sfrutto per accelerare di molto il processo di editing.
Mapping
Il mapping permette di definire (o ridefinire) il significato di una sequenza di tasti in ViM. Considerando che ViM è un editor modale, i mapping possono funzionare solo in determinate modalità. Il comando
:map sequenza comandi funziona per le modalità normale e visuale (oltre che per la modalità
waiting for operator, che non ci interessa), mentre il comando
:imap sequenza comandi funziona per la modalità inserimento.
Split windows
La prima, utile caratteristica di ViM che viene in aiuto sono le
split windows, ovvero la possibilità di dividere la finestra corrente in più finestre.
La divisione può essere orizzontale o verticale. Il comando per suddividere orizzontalmente la finestra è
:sp nomefile, da eseguire in modalità command. Per la suddivisione verticale, si può utilizzare
:vsp nomefile. Per chiudere la finestra, basta il semplice
:wq, mentre per passare da una finestra all'altra è necessaria la combinazione di tasti
<CTRL-w><CTRL-w>.
Quest'ultimo comando permette di spostarsi ciclicamente tra le finestre. Per massimizzare l'ampiezza della finestra corrente, si utilizza <CTRL-w>_.
Iniziando a provarle, vi accorgerete di quanto sia potente questa funzionalità!
Un paio di osservazioni:
- È alquanto scomodo premere in continuazione <CTRL-w><CTRL-w> per passare tra le finestre
- La finestra non si massimizza totalmente, ma mostra comunque una riga per ciascun file aperto in contemporanea
Per superare l'ultima limitazione, basta utilizzare il comando
:set wmh=0, che imposta l'altezza minima di una finestra a 0, lasciando visibile solo una riga con il nome del file invece di due righe,
Per accelerare i tempi di transizione tra le finestre, è sufficiente creare un mapping personalizzato. Con le due istruzioni
:map <C-J> <C-W>j<C-W>_ e
:map <C-K> <C-W>k<C-W>_ associeremo alla combinazione di tasti <CTRL-J> il movimento allo split inferiore (con conseguente massimizzazione dello stesso), ed alla combinazione <CTRL-K> il movimento allo split superiore (con massimizzazione).
I tab
I tab sono stati introdotti in ViM 7, e sono una funzionalità che ritroviamo in molte applicazioni (principalmente web browser, ma anche altri editor o IDE).
Ecco i comandi di ViM per utilizzare i tab:
- :tabe nomefile Apre un nuovo tab.
- :tabn Vai al tab successivo.
- :tabp Vai al tab precedente.
Vi renderete conto che è alquanto scomodo passare da un tab all'altro. Per questo ho creato questi due mapping:
- :map <C-L> :tabn<CR>
- :map <C-H> :tabp<CR>
Questi mapping associano ai tasti indicati i movimenti verso il tab precedente e successivo. Ora mancano solo due passaggi per terminare la personalizzazione.
La modalità inserimento
I mapping che abiamo indicato funzionano in modalità normale ed in modalità visuale. Sarebbe utile che funzionassero anche in modalità inserimento, possibilmente senza dover uscire dalla stessa.
Per fare ciò, sfruttiamo il comando
imap:
- :imap <C-J> <Esc><C-J>a
- :imap <C-K> <Esc><C-K>a
- :imap <C-L> <Esc><C-L>a
- :imap <C-H> <Esc><C-H>a
I comandi di mapping sono
ricorsivi, ovvero si può inserire un mapping dentro un altro mapping.
Nei mapping della lista descritta sopra, la prima cosa che viene eseguita è la simulazione della pressione del tasto Escape, e ciò ci porta in modalità normale. Successivamente viene simulata la pressione di una combinazione di tasti, che richiama una delle combinazioni che sono state descritte precedentemente. Infine, viene simulata la pressione del tasto a, che ci riporta in modalità inserimento.
Mettiamo tutto nel file .vimrc
Ovviamente è desiderabile non dover digitare ogni volta tutti questi comandi, quindi inseriamo tutto nel nostro
.vimrc, in modo che ogni volta che ViM venga avviato possiamo usufruire di questi mapping.
Ecco la sequenza completa da inserire:
map <C-J> <C-W>j<C-W>_
map <C-K> <C-W>k<C-W>_
map <C-L> :tabn<CR>
map <C-H> :tabp<CR>
imap <C-J> <Esc><C-J>a
imap <C-K> <Esc><C-K>a
imap <C-L> <Esc><C-L>a
imap <C-H> <Esc><C-H>a
set wmh=0
Da notare l'assenza dei due punti all'inizio dei comandi.
Conclusioni
Da quando utilizzo questi mapping, sono molto più veloce nell'utilizzo di vim, e ciò mi permette di concentrarmi su ciò che sto facendo piuttosto che sull'utilizzo dell'editor stesso.
Ciò dimostra come, sebbene la curva di apprendimento sia ripida, imparare ad utilizzare ViM può incrementare notevolmente la produttività.
Ed ora.. godetevi questi mapping!