:vim — corso in 10 lezioni
Lezione 04 di 10

Inserire, annullare, ripetere

Il modo INSERT ha più di un ingresso, e sceglierlo bene ti risparmia metà dei movimenti. Poi c'è ., un tasto solo, che è probabilmente il comando più redditizio di tutto Vim.

Teoria

Sei modi di entrare in INSERT

Premere i e poi navigare fino al punto giusto è lo sbaglio del principiante. Vim ha un tasto per ogni punto d'ingresso comune: la posizione la scegli entrando, non dopo.

TastoEntra in INSERT…
i   aprima / dopo il carattere sotto il cursore
I   Aall'inizio del testo della riga / a fine riga
o   Oaprendo una riga nuova sotto / sopra, già indentata
giesattamente dove avevi smesso di scrivere l'ultima volta
cc   Csvuotando la riga intera / da qui a fine riga
s   Scancellando il carattere / la riga e inserendo

Modifiche piccole che non richiedono INSERT

TastoEffetto (si resta in NORMAL)
x   Xcancella il carattere sotto / prima del cursore
rxsostituisce il carattere con x e basta
~inverte maiuscolo/minuscolo e avanza
Junisce la riga sotto a questa, sistemando gli spazi
gJle unisce senza toccare gli spazi
Ctrl-a   Ctrl-xincrementa / decrementa il numero sotto o dopo il cursore

Annullare, e annullare l'annullamento

ComandoEffetto
uannulla l'ultima modifica · 3u le ultime tre
Ctrl-rrifà ciò che hai annullato
Uannulla tutte le modifiche fatte sull'ultima riga toccata
:earlier 10mriporta il file com'era dieci minuti fa
:later 5me riavanti di cinque
Un'unità di annullamento = un passaggio in INSERT. Se entri con i, scrivi trenta righe e premi Esc, un solo u le porta via tutte. Premere Esc ogni tanto mentre scrivi crea punti di ripristino più fini. In alternativa, Ctrl-gu dentro INSERT spezza l'unità senza uscire.
Pratica

Il punto: ripetere l'ultima modifica

NORMAL . ripete l'ultima modifica, ovunque tu sia 7,3  18%

. riesegue l'ultimo comando che ha cambiato il testo, inserimento compreso. Non ripete i movimenti né i comandi con i due punti: solo le modifiche. Il modo giusto di lavorare in Vim è quindi: fai una modifica in una forma ripetibile, spostati, premi il punto.

aggiungere il punto e virgola dimenticato
let a = 1
let b = 2
let c = 3

# A ; Esc     → sistema la prima riga
# j .          → scendi e ripeti
# j .          → e ancora

let a = 1;
let b = 2;
let c = 3;

Due tasti per riga, e la sequenza j. si tiene premuta a lungo senza pensare. La stessa idea vale per daw ripetuto su parole diverse, >> ripetuto su righe diverse, ciw seguito da una parola nuova.

Scorciatoie utili dentro INSERT

TastoEffetto senza uscire da INSERT
Ctrl-wcancella la parola appena scritta
Ctrl-ucancella tutto quello che hai inserito nella riga
Ctrl-r regincolla il contenuto di un registro (lezione 5)
Ctrl-oesegue un solo comando NORMAL e torna a scrivere
Ctrl-n   Ctrl-pcompleta la parola guardando le altre parole del file
Ctrl-t   Ctrl-daumenta / riduce l'indentazione della riga
Ctrl-n è più utile di quanto sembri. Non è intelligente — non conosce il linguaggio — ma completa qualsiasi parola già presente nei file aperti. Sui nomi di variabili lunghi funziona benissimo e non richiede nessun plugin.
Trucco

cgn: sostituire occorrenze una a una, col punto

Il comando :s (lezione 6) sostituisce in blocco. Ma spesso vuoi decidere caso per caso, guardando il contesto. La combinazione classica è cgn: gn è un oggetto di testo che significa «la prossima occorrenza dell'ultima ricerca».

il flusso completo
/vecchioNome          # 1. cerca il termine
cgn nuovoNome Esc    # 2. cambia questa occorrenza
.                       # 3. ripeti sulla prossima
n                       # oppure: salta questa e vai avanti
.                       # e riprendi

Il bello è che . qui fa due cose insieme: salta alla prossima occorrenza e applica la modifica. Quindi tieni premuto il punto finché ti va bene, e quando incontri un caso da lasciare stare premi n per scavalcarlo. È un :%s///gc ma con il testo davanti agli occhi e con u sempre disponibile.

Scorciatoia per la ricerca: con il cursore su una parola, il tasto * la cerca in avanti (parola intera) e imposta l'ultima ricerca. Quindi il flusso completo diventa * poi cgn, senza digitare il termine.