Vim è un editor modale
Tutti gli altri editor hanno un modo solo: quello che scrivi finisce nel file. Vim ne ha diversi, e da questo dipende tutto il resto. Capito questo, il resto del corso è solo vocabolario.
Perché i modi non sono una stranezza
In un editor normale la tastiera fa una cosa sola: inserisce caratteri. I comandi stanno altrove — nei menu, nelle scorciatoie con tre tasti premuti insieme. Vim fa la scelta opposta: la tastiera cambia significato a seconda del modo, così le lettere che hai sotto le dita diventano comandi a un tasto.
La conseguenza pratica: in Vim si passa la maggior parte del tempo senza scrivere testo. Si legge, si naviga, si sposta, si cancella, si duplica. L'inserimento è un'eccezione breve, non lo stato di riposo. Chi si trova male con Vim quasi sempre sta facendo l'errore opposto: resta in inserimento e usa le frecce.
I quattro modi che contano
| Modo | Come ci si entra | A cosa serve |
|---|---|---|
| NORMAL | è quello di partenza · Esc | navigare, cancellare, copiare, ripetere. La casa. |
| INSERT | i a o O I A | scrivere testo, come in qualsiasi altro editor. |
| VISUAL | v caratteri · V righe · Ctrl-v blocco | selezionare prima e agire dopo, quando non ricordi il comando giusto. |
| COMMAND-LINE | : comandi · / ricerca | salvare, uscire, sostituire, tutto ciò che si scrive per esteso. |
Esiste anche REPLACE (R, sovrascrive invece di inserire) e qualche variante minore, ma con questi quattro fai il 99% del lavoro. Da qualunque modo, Esc riporta in NORMAL. Se il tasto Esc è lontano, Ctrl-[ fa esattamente la stessa cosa senza muovere le mani.
Quella lì sopra è la statusline: la riga in fondo alla finestra di Vim. Nel dubbio su dove ti trovi, guardala — o premi Esc due volte e riparti da NORMAL. In questo corso la userò per segnalarti in che modo devi essere prima di premere i tasti di cui parlo.
Aprire, scrivere, salvare, uscire
Apri un terminale e crea un file di prova. Non usare un file vero finché non ti senti a tuo agio.
$ vim prova.txtSei in NORMAL su un file vuoto. Ora, nell'ordine:
- Premi i — la statusline mostra
-- INSERT --. - Scrivi due o tre righe qualunque.
- Premi Esc — torni in NORMAL, l'indicazione sparisce.
- Scrivi
:we Invio: il file è salvato. - Scrivi
:qe Invio: sei fuori.
| Comando | Cosa fa |
|---|---|
| :w | salva (write) e resta dentro |
| :q | esce, ma si rifiuta se ci sono modifiche non salvate |
| :wq oppure :x | salva ed esce · :x scrive solo se serve davvero |
| :q! | esce buttando via le modifiche · il ! significa «lo so, fallo» |
| :w nuovo.txt | salva con un altro nome, come «salva con nome» |
| :qa! | esce da tutti i file aperti, senza salvare nulla |
| ZZ | salva ed esce, in NORMAL, senza due punti |
| ZQ | esce senza salvare, in NORMAL |
Un'ultima cosa prima di andare avanti: sul tuo sistema c'è già un tutorial interattivo ufficiale, mezz'ora ben spesa che ti fa muovere le dita mentre leggi.
$ vimtutor # in italiano, se disponibile: $ vimtutor it
Salvare un file di sistema che hai aperto senza sudo
Succede sempre: apri /etc/hosts, modifichi venti righe, dai
:w e Vim ti risponde che il file è in sola lettura. La soluzione
stupida è uscire, perdere tutto e riaprire con sudo. Quella giusta
è passare il contenuto del buffer a tee lanciato come root:
:w !sudo tee % > /dev/null
Pezzo per pezzo: :w !comando non salva il file, manda il
testo del buffer allo standard input di quel comando; % è
un'abbreviazione per «il nome del file corrente»; tee lo riscrive
con i permessi di root; > /dev/null butta via l'output che
altrimenti ti sporcherebbe lo schermo. Vim ti chiederà la password e poi ti
dirà che il file è cambiato fuori: rispondi L per ricaricarlo.
:w !sudo tee % > /dev/null attraverso
:!sudo -A con un askpass grafico, oppure più semplicemente
:sav /tmp/copia e poi sudo mv dal terminale.