:vim — corso in 10 lezioni
Lezione 03 di 10

La grammatica: operatore + movimento

Qui Vim smette di essere una lista di scorciatoie e diventa una lingua. Non devi memorizzare cento comandi: ne impari una dozzina e li combini. Questa è la lezione che vale per tutte le altre.

Teoria

Un verbo, un complemento

Quasi ogni modifica in Vim si scrive così:

la formula
[numero] operatore [numero] movimento

# d w   →  cancella una parola
# c $   →  riscrivi da qui a fine riga
# y 3j  →  copia questa riga e le tre sotto
# > }   →  indenta fino a fine paragrafo

L'operatore è il verbo, il movimento dice fin dove. Tutti i movimenti della lezione 2 funzionano come complemento, senza eccezioni: se hai imparato f, hai imparato anche df, cf, yf. Questo è il motivo per cui Vim si impara moltiplicando, non sommando.

Gli operatori che userai

OperatoreVerbo
ddelete — cancella (e mette nel registro, quindi è anche un «taglia»)
cchange — cancella e entra in INSERT
yyank — copia
>   <indenta / de-indenta
=reindenta secondo le regole del linguaggio
gu   gU   g~minuscolo / maiuscolo / inverti
gqmanda a capo il testo rispettando textwidth
Raddoppiare l'operatore significa «tutta la riga». dd cancella la riga, yy la copia, cc la riscrive, >> la indenta. E il conteggio vale anche qui: 3dd cancella tre righe.

Gli oggetti di testo: il salto di qualità

I movimenti partono dal cursore e vanno in una direzione. Gli oggetti di testo no: descrivono una regione attorno al cursore, non importa dove ti trovi dentro di essa. Si scrivono con due lettere: i per «inner» (solo il contenuto) o a per «a / around» (contenuto più delimitatori), seguite dal tipo di oggetto.

OggettoRegione
iw   awparola · aw include lo spazio dopo
is   asfrase
ip   apparagrafo
i"   a"tra virgolette doppie · idem con i' e i`
i(   a(tra parentesi tonde · vale anche ib
i{   a{tra graffe · vale anche iB
i[   a[tra quadre
it   atdentro un tag HTML/XML · at include il tag stesso

Un oggetto si usa al posto del movimento: diw, ci", ya{, =ip. E funziona con il cursore ovunque dentro la regione, il che elimina il passo «prima arrivo all'inizio».

Pratica

Modifiche chirurgiche senza selezionare

riga di partenza — cursore ovunque dentro le virgolette
<a href="https://vecchio-dominio.it/pagina" class="btn">Scopri</a>
BattiOttieni
ci"svuota l'URL e ti mette in INSERT tra le virgolette: riscrivi e Esc
citsostituisce il testo dentro il tag, cioè «Scopri»
datcancella il link intero, tag di apertura e chiusura compresi
yi"copia l'URL senza le virgolette
dawcancella la parola sotto il cursore e lo spazio che la segue

Confronta con il metodo «normale»: cliccare prima della h, trascinare fino alla a finale, sperare di non aver preso la virgoletta, cancellare, scrivere. Sono tre tasti contro dieci secondi di mira.

Quando l'oggetto non c'è, c'è il movimento

un CSV, cursore all'inizio
Rossi,Mario,1978,Firenze,attivo
VISUAL in caso di dubbio, seleziona prima e guarda 3,18  42%

Se non ti fidi di quello che sta per succedere, premi v e poi il movimento o l'oggetto: la selezione si illumina, così vedi la regione prima di agire. Poi d, c, y operano su quella. È la stessa grammatica, in ordine inverso — utile per imparare, un po' più lenta a regime.

Trucco

Il blocco verticale: Ctrl-v

Il modo VISUAL a blocchi seleziona un rettangolo di caratteri invece che un intervallo di testo, e permette di modificare tante righe insieme nello stesso punto. È la cosa che gli editor moderni chiamano «cursori multipli», solo che qui c'era già trent'anni fa.

commentare sei righe di configurazione
# 1. Ctrl-v          → visual blocco
# 2. 5j              → estendi la selezione a sei righe
# 3. I                → inserisci prima del blocco
# 4. #                → scrivi il carattere
# 5. Esc              → e appare su tutte le righe

#listen 80;
#server_name esempio.it;
#root /var/www;
#index index.html;
#access_log off;
#gzip on;
Dentro Ctrl-vEffetto
I  … Escinserisce lo stesso testo all'inizio del blocco, su ogni riga
A  … Esclo aggiunge alla fine del blocco
$A  … Esclo aggiunge a fine riga vera, anche se le righe hanno lunghezze diverse
dcancella la colonna selezionata
rxsostituisce ogni carattere del blocco con x
g Ctrl-atrasforma una colonna di 1 in 1, 2, 3, 4… numerazione automatica
Da ricordare: con I e A il testo appare su tutte le righe solo dopo l'Esc. Mentre scrivi lo vedi su una sola: non è un errore, non ripetere l'operazione.