:vim — corso in 10 lezioni
Lezione 05 di 10

Registri, appunti di sistema, macro

Vim non ha «una» clipboard: ne ha una trentina, con nomi. Capirlo risolve il fastidio più comune dei primi giorni — «ho copiato una cosa, poi ne ho cancellata un'altra, e adesso incollo quella sbagliata» — e apre la porta alle macro.

Teoria

Trenta cassetti invece di uno

Ogni copia e ogni cancellazione finisce in un registro. Il registro si indica con " seguito da una lettera, messo prima del comando: "ayy copia la riga nel registro a, "ap la incolla da lì.

RegistroCosa contiene
""l'innominato: l'ultima copia o cancellazione. È quello usato da p se non specifichi nulla.
"0solo l'ultimo yank. Le cancellazioni non lo toccano.
"1 … "9lo storico delle cancellazioni di almeno una riga: "1 è la più recente.
"a … "zi tuoi, quelli che scegli tu. Con la maiuscola ("A) accodi invece di sovrascrivere.
"+   "*gli appunti del sistema operativo
"_il cestino: "_d cancella senza sporcare nessun registro
"%   ":   ".nome del file · ultimo comando · ultimo testo inserito

Per vedere cosa c'è dentro tutti quanti, in qualsiasi momento: :registers (o :reg).

Incollare

ComandoEffetto
p   Pincolla dopo / prima del cursore. Se il registro contiene righe intere, va sotto o sopra la riga.
gpcome p, ma lascia il cursore dopo il testo incollato
]pincolla adattando l'indentazione al punto in cui sei — indispensabile nel codice
"+pincolla dagli appunti di sistema
Pratica

Parlare con gli appunti del sistema

Il registro "+ è il ponte tra Vim e il resto del computer. Perché esista, Vim dev'essere compilato con il supporto agli appunti: verificalo così.

c'è o non c'è?
$ vim --version | grep clipboard
+clipboard         +xterm_clipboard   # bene
-clipboard         -xterm_clipboard   # manca: vedi sotto
Se leggi il segno meno: su Debian e derivate installa vim-gtk3 al posto di vim-tiny; su macOS il Vim di sistema è spesso senza clipboard, e conviene brew install vim (oppure usare Neovim, che gli appunti li gestisce da sé).
ComandoEffetto
"+yycopia la riga negli appunti di sistema
"+y5jcopia sei righe negli appunti
"+yGcopia da qui a fine file
gg"+yGcopia il file intero, dall'inizio
"+pincolla ciò che hai copiato in un'altra applicazione

Il fastidio numero uno, e la sua soluzione

Copi una riga con yy, poi ne cancelli un'altra con dd, poi premi p e ti ritrovi incollata quella cancellata. Non è un bug: dd ha sovrascritto il registro innominato. Ma lo yank è ancora al sicuro nel registro 0:

recuperare la copia originale
yy        # la copia finisce in "" e in "0
dd        # la cancellazione sovrascrive "" (ma non "0)
"0p       # incolla quello che avevi copiato davvero

Stesso problema in VISUAL: se selezioni del testo e premi p, il testo sostituito finisce nel registro innominato e la copia successiva incolla quello. Anche lì la risposta è "0p, oppure incollare con "_dP per buttare via il testo sostituito.

Trucco

Le macro: registrare una volta, eseguire mille

Una macro è semplicemente una sequenza di tasti salvata in un registro. Non c'è un linguaggio da imparare: registri quello che faresti a mano e lo rilanci.

NORMAL recording @q 4,1  12%
ComandoEffetto
qqinizia a registrare nel registro q (una lettera qualunque)
qferma la registrazione
@qesegue la macro
@@riesegue l'ultima macro usata
50@qla esegue cinquanta volte, o finché non trova un errore
da elenco a righe SQL, una macro sola
# partenza
Mario Rossi
Anna Bianchi
Luca Verdi

# registrazione:  qq  I INSERT INTO utenti VALUES (' Esc  A ');  Esc  j  q
# poi:            2@q

INSERT INTO utenti VALUES ('Mario Rossi');
INSERT INTO utenti VALUES ('Anna Bianchi');
INSERT INTO utenti VALUES ('Luca Verdi');

Tre regole per macro che non si rompono

Una macro si può correggere a mano. È solo testo in un registro: incollala in una riga vuota con "qp, sistema il tasto sbagliato, riselezionala e rimettila dentro con "qy$. Nella lezione 8 vedremo come lanciarla su tutte e sole le righe che corrispondono a un pattern.