:vim — corso in 10 lezioni
Lezione 01 di 10

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.

Teoria

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.

NORMAL "note.txt" 42L, 1180B 12,1  Top

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.

Pratica

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.

il primo file
$ vim prova.txt

Sei in NORMAL su un file vuoto. Ora, nell'ordine:

  1. Premi i — la statusline mostra -- INSERT --.
  2. Scrivi due o tre righe qualunque.
  3. Premi Esc — torni in NORMAL, l'indicazione sparisce.
  4. Scrivi :w e Invio: il file è salvato.
  5. Scrivi :q e Invio: sei fuori.
ComandoCosa fa
:wsalva (write) e resta dentro
:qesce, ma si rifiuta se ci sono modifiche non salvate
:wq oppure :xsalva ed esce · :x scrive solo se serve davvero
:q!esce buttando via le modifiche · il ! significa «lo so, fallo»
:w nuovo.txtsalva con un altro nome, come «salva con nome»
:qa!esce da tutti i file aperti, senza salvare nulla
ZZsalva ed esce, in NORMAL, senza due punti
ZQesce senza salvare, in NORMAL
Se Vim sembra bloccato: quasi sempre hai premuto Ctrl-s, che nel terminale mette in pausa l'output. Si riparte con Ctrl-q. L'altro caso classico è essere finito in un sotto-modo: Esc ripetuto risolve.

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.

il tutorial incluso in vim
$ vimtutor
# in italiano, se disponibile:
$ vimtutor it
Trucco

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:

scrivere comunque
: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.

Su Neovim questa forma non funziona (non c'è modo di digitare la password). Lì si usa :w !sudo tee % > /dev/null attraverso :!sudo -A con un askpass grafico, oppure più semplicemente :sav /tmp/copia e poi sudo mv dal terminale.