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.
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ì.
| Registro | Cosa contiene |
|---|---|
| "" | l'innominato: l'ultima copia o cancellazione. È quello usato da p se non specifichi nulla. |
| "0 | solo l'ultimo yank. Le cancellazioni non lo toccano. |
| "1 … "9 | lo storico delle cancellazioni di almeno una riga: "1 è la più recente. |
| "a … "z | i 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
| Comando | Effetto |
|---|---|
| p P | incolla dopo / prima del cursore. Se il registro contiene righe intere, va sotto o sopra la riga. |
| gp | come p, ma lascia il cursore dopo il testo incollato |
| ]p | incolla adattando l'indentazione al punto in cui sei — indispensabile nel codice |
| "+p | incolla dagli appunti di sistema |
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ì.
$ vim --version | grep clipboard +clipboard +xterm_clipboard # bene -clipboard -xterm_clipboard # manca: vedi sotto
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é).
| Comando | Effetto |
|---|---|
| "+yy | copia la riga negli appunti di sistema |
| "+y5j | copia sei righe negli appunti |
| "+yG | copia da qui a fine file |
| gg"+yG | copia il file intero, dall'inizio |
| "+p | incolla 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:
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.
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.
| Comando | Effetto |
|---|---|
| inizia a registrare nel registro q (una lettera qualunque) | |
| q | ferma la registrazione |
| @q | esegue la macro |
| @@ | riesegue l'ultima macro usata |
| 50@q | la esegue cinquanta volte, o finché non trova un errore |
# 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
-
Inizia sempre da una posizione nota. Metti
^o 0 come primo tasto della registrazione: così non dipende da dov'era il cursore. - Finisci spostandoti sulla riga successiva (j), così la macro è concatenabile con sé stessa.
-
Non fidarti del conteggio esatto: usa un numero abbondante,
tipo
999@q. Quando la macro fallisce (fine file, ricerca a vuoto) Vim si ferma da solo.
"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.