domenica 16 marzo 2008

Editing (comodo) di più file in ViM

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:

  1. È alquanto scomodo premere in continuazione <CTRL-w><CTRL-w> per passare tra le finestre

  2. 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!

4 commenti:

maelstrom ha detto...

E adesso anche altri adepti, speriamo, inizieranno a scalare la ripida curva di apprendimento di ViM!!!

Mi è stato fedele compagno in 4 anni di università su 5, spero che continuerà a farmi compagnia ancora a lungo.. e voglio vedere il tuo libro, se ne vale la pena lo prendo anche io!!

vannyn ha detto...

Uso ViM da qualche anno, ma ho sempre avuto un approccio un po' statico (sapevo fare quelle 4 cose e so fare quelle 4 cose)...

Finora più che "hacking ViM" la mia esperienza è "Cracking ViM":
1. Trovo uno script avanzato che fa proprio al caso mio
2. Con qualche difficoltà lo faccio funzionare
3. Mi accorgo che non funziona più quello che prima funzionava alla grande
4. Non capisco perchè non funziona neanche lo script che avevo fatto funzionare al punto 2
4. Basta! Lascio ViM e cerco un IDE che potrebbe fare al caso mio
5. Se lo trovo, è lento e torno a Vim
6. Rieccomi al punto 1.
:)
Comunque, ti prometto che proverò quanto hai (molto chiaramente) spiegato nel post

lupino3 ha detto...

Tranquillo mitico Vannyn, in una delle nostre serate a base di zibibbo e PES dedicheremo un'oretta alla messa a punto del tuo ViM! Promesso!

:D

Bye,

Khalida ha detto...

People should read this.