Più file insieme: buffer, finestre, schede
Vim distingue tre cose che altrove sono una sola: il file caricato in memoria, il riquadro che lo mostra, e la disposizione dei riquadri sullo schermo. Tenerle separate confonde per un giorno e fa comodo per sempre.
Tre concetti, in ordine di importanza
- Buffer — un file caricato in memoria. Se apri dieci file hai dieci buffer, anche se ne vedi uno solo. È il concetto che conta.
- Finestra (window) — un riquadro che mostra un buffer. Puoi avere due finestre sullo stesso buffer, per guardare due punti dello stesso file.
- Scheda (tab) — non è «un file aperto» come nei browser: è una disposizione di finestre. Serve per tenere due layout diversi, non per elencare i file.
Buffer
| Comando | Effetto |
|---|---|
| :e file | apre un file in un nuovo buffer |
| :ls oppure :buffers | elenca i buffer con il loro numero |
| :b 3 | passa al buffer numero 3 |
| :b conf | passa al buffer il cui nome contiene «conf» — basta un pezzo |
| :bn :bp | buffer successivo / precedente |
| Ctrl-^ | salta all'ultimo buffer visitato. Un tasto, avanti e indietro. |
| :bd | chiude il buffer corrente (il file resta sul disco) |
:set hidden è quasi obbligatorio. Senza, Vim si
rifiuta di lasciare un buffer modificato e ti costringe a salvare a ogni
cambio. Con l'opzione attiva i buffer non salvati restano in memoria e passi da
uno all'altro liberamente.
Finestre
| Comando | Effetto |
|---|---|
| :sp :vs | divide in orizzontale / in verticale |
| :vs file | apre quel file nella nuova finestra verticale |
| Ctrl-w h j k l | sposta il cursore nella finestra a sinistra, sotto, sopra, destra |
| Ctrl-w w | gira ciclicamente tra le finestre |
| Ctrl-w H J K L | sposta la finestra in quella posizione |
| Ctrl-w = | ridimensiona tutto in parti uguali |
| Ctrl-w _ Ctrl-w | | massimizza in altezza / in larghezza |
| Ctrl-w c Ctrl-w o | chiude questa / chiude tutte le altre |
| 10 Ctrl-w + | allarga di dieci righe |
Schede
| Comando | Effetto |
|---|---|
| :tabnew file | nuova scheda |
| gt gT | scheda successiva / precedente |
| 3gt | vai alla terza |
| :tabclose :tabonly | chiude questa / tutte le altre |
Aprire i file senza uscire da Vim
Vim ha un esploratore di file incorporato, netrw. Non è bello, ma non richiede plugin e funziona ovunque, anche su un server appena installato.
| Comando | Effetto |
|---|---|
| :Ex | apre l'esploratore nella cartella del file corrente |
| :Vex :Sex | lo apre in una finestra verticale / orizzontale |
| - | dentro netrw: sale alla cartella superiore |
| Invio | apre file o cartella |
| % | crea un nuovo file nella cartella |
| d D R | crea cartella · elimina · rinomina |
Dalla riga di comando
$ vim file1.php file2.php # due buffer, :n e :N per passare $ vim -p *.md # uno per scheda $ vim -o file1 file2 # finestre orizzontali $ vim -O file1 file2 # finestre verticali (confronto affiancato) $ vim +42 file.php # apri direttamente alla riga 42 $ vim +/funzione file.php # apri alla prima occorrenza $ vim $(grep -rl "TODO" src/) # apri tutti i file che contengono TODO
L'ultimo esempio è il ponte con il corso su grep: grep -rl elenca i
file, la sostituzione di comando li passa a Vim come buffer. Da lì
:bn per scorrerli, oppure la lezione 8 per agire su tutti insieme.
Aprire i file per nome, senza plugin: path+=**
Tutti installano un cercatore di file «fuzzy» come prima cosa. Prima di farlo, prova queste due righe: Vim sa già cercare ricorsivamente nel progetto, va solo detto dove guardare.
set path+=** # cerca in tutte le sottocartelle set wildmenu # menu di completamento sulla riga di comando set wildignore+=**/node_modules/**,**/.git/**,**/vendor/**
Da quel momento, lanciando Vim dalla radice del progetto:
:find header<Tab> header.php header-mobile.php header.scss # scorri con Tab :find *utente*.php<Tab> # con jolly, ovunque nel nome :sfind config.php # aprilo in una finestra nuova :vert sfind config.php # o in verticale
:b seguito da un frammento del nome e
Tab ci arriva in tre tasti, senza guardare l'elenco. Se aggiungi
set wildmode=longest:full,full il completamento si comporta come
quello della shell.
path+=** diventa lento, e lì un plugin dedicato — fzf,
CtrlP, Telescope su Neovim — è la scelta giusta. Su un sito o un progetto normale
da qualche centinaio di file, la differenza non si sente.