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.
Un verbo, un complemento
Quasi ogni modifica in Vim si scrive così:
[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
| Operatore | Verbo |
|---|---|
| d | delete — cancella (e mette nel registro, quindi è anche un «taglia») |
| c | change — cancella e entra in INSERT |
| y | yank — copia |
| > < | indenta / de-indenta |
| = | reindenta secondo le regole del linguaggio |
| gu gU g~ | minuscolo / maiuscolo / inverti |
| gq | manda a capo il testo rispettando textwidth |
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.
| Oggetto | Regione |
|---|---|
| iw aw | parola · aw include lo spazio dopo |
| is as | frase |
| ip ap | paragrafo |
| 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 at | dentro 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».
Modifiche chirurgiche senza selezionare
<a href="https://vecchio-dominio.it/pagina" class="btn">Scopri</a>| Batti | Ottieni |
|---|---|
| ci" | svuota l'URL e ti mette in INSERT tra le virgolette: riscrivi e Esc |
| cit | sostituisce il testo dentro il tag, cioè «Scopri» |
| dat | cancella il link intero, tag di apertura e chiusura compresi |
| yi" | copia l'URL senza le virgolette |
| daw | cancella 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
Rossi,Mario,1978,Firenze,attivo
dt,— cancella fino alla virgola, esclusa: resta,Mario,…df,— cancella fino alla virgola, inclusa.d2f,— arriva alla seconda virgola: cancella due campi in un colpo.c3f,— cancella tre campi e ti lascia pronto a riscriverli.
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.
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.
# 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-v | Effetto |
|---|---|
| I … Esc | inserisce lo stesso testo all'inizio del blocco, su ogni riga |
| A … Esc | lo aggiunge alla fine del blocco |
| $A … Esc | lo aggiunge a fine riga vera, anche se le righe hanno lunghezze diverse |
| d | cancella la colonna selezionata |
| rx | sostituisce ogni carattere del blocco con x |
| g Ctrl-a | trasforma una colonna di 1 in 1, 2, 3, 4… numerazione automatica |