:vim — corso in 10 lezioni
Lezione 07 di 10

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.

Teoria

Tre concetti, in ordine di importanza

COMMAND :ls — l'elenco dei buffer aperti 3 buffers

Buffer

ComandoEffetto
:e fileapre un file in un nuovo buffer
:ls oppure :bufferselenca i buffer con il loro numero
:b 3passa al buffer numero 3
:b confpassa al buffer il cui nome contiene «conf» — basta un pezzo
:bn   :bpbuffer successivo / precedente
Ctrl-^salta all'ultimo buffer visitato. Un tasto, avanti e indietro.
:bdchiude 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

ComandoEffetto
:sp   :vsdivide in orizzontale / in verticale
:vs fileapre quel file nella nuova finestra verticale
Ctrl-w h j k lsposta il cursore nella finestra a sinistra, sotto, sopra, destra
Ctrl-w wgira ciclicamente tra le finestre
Ctrl-w H J K Lsposta 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 ochiude questa / chiude tutte le altre
10 Ctrl-w +allarga di dieci righe

Schede

ComandoEffetto
:tabnew filenuova scheda
gt   gTscheda successiva / precedente
3gtvai alla terza
:tabclose   :tabonlychiude questa / tutte le altre
Pratica

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.

ComandoEffetto
:Exapre l'esploratore nella cartella del file corrente
:Vex   :Sexlo apre in una finestra verticale / orizzontale
-dentro netrw: sale alla cartella superiore
Invioapre file o cartella
%crea un nuovo file nella cartella
d   D   Rcrea cartella · elimina · rinomina

Dalla riga di comando

aprire più file insieme
$ 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.

Trucco

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.

nel .vimrc
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:

trovare un file per pezzo di nome
: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
La stessa idea vale per i buffer già aperti. Dopo un po' di lavoro hai venti buffer: :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.
Un avvertimento onesto: su progetti enormi (decine di migliaia di file) 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.