Cosa fa#
Editor di testo modale a riga di comando. A differenza degli editor grafici, vim ha modalita' distinte: in Normal mode i tasti sono comandi, in Insert mode si scrive testo. Presente su tutti i sistemi Unix anche minimali — conoscerlo e' requisito per lavorare su server remoti senza interfaccia grafica.
Sintassi#
vim [system]
vi vs vim#
vi e' l'editor originale scritto da Bill Joy nel 1976. vim (Vi IMproved) e' la versione moderna — aggiunge syntax highlighting, undo multiplo, split window, plugin e molto altro. Su quasi tutti i sistemi Linux moderni vi e' un alias o symlink a vim.
# Verifica cosa e' vi sul tuo sistema
ls -la $(which vi) # se e' un symlink → punta a vim
vi --version # se risponde VIM → e' vimLe tre modalita'#
NORMAL MODE INSERT MODE VISUAL MODE
(navigazione e comandi) (scrittura testo) (selezione)
│ │ │
│ i / a / o │ Esc │ Esc
│─────────────────────────►│◄───────────────────────│
│ │
│ v / V / Ctrl+v │
│───────────────────────────────────────────────────►│
│◄───────────────────────────────────────────────────│
EscQuando apri vim sei sempre in Normal mode. Tutti i tasti sono comandi, non scrivono testo.
Entrare e uscire dalle modalita'#
| Tasto | Da | A | Significato |
|---|---|---|---|
i | Normal | Insert | insert — inserisci prima del cursore |
a | Normal | Insert | append — inserisci dopo il cursore |
A | Normal | Insert | Append — inserisci a fine riga |
o | Normal | Insert | open — apri nuova riga sotto e inserisci |
O | Normal | Insert | Open — apri nuova riga sopra e inserisci |
v | Normal | Visual | visual — selezione carattere per carattere |
V | Normal | Visual | Visual — selezione riga intera |
Ctrl+v | Normal | Visual | selezione blocco rettangolare |
Esc | qualsiasi | Normal | torna sempre a Normal mode |
Navigazione — Normal mode#
| Tasto | Significato lettera | Cosa fa |
|---|---|---|
h | h = sinistra (Vim layout) | Un carattere a sinistra |
l | l = destra (Vim layout) | Un carattere a destra |
j | j = freccia giu' in Vim | Una riga in giu' |
k | k = freccia su in Vim | Una riga in su' |
0 | zero = inizio assoluto | Inizio della riga corrente |
^ | caret = primo non-spazio | Primo carattere non-whitespace della riga |
$ | dollar = fine riga (regex) | Fine della riga corrente |
w | word | Inizio della parola successiva (include punteggiatura) |
W | Word (maiuscola) | Inizio della parola successiva (ignora punteggiatura) |
b | back | Inizio della parola precedente |
B | Back (maiuscola) | Inizio della parola precedente (ignora punteggiatura) |
Ctrl+f | forward | Una pagina avanti |
Ctrl+b | backward | Una pagina indietro |
nG | Go to line n | Vai alla riga n (es. 1G = prima riga, 20G = riga 20) |
G | Go (fine) | Vai all'ultima riga del file |
gg | go go | Vai alla prima riga (alternativa a 1G) |
Eliminare testo — Normal mode#
Il pattern e': [numero] operatore [movimento]
| Comando | Significato | Cosa fa |
|---|---|---|
x | x = taglia un carattere | Elimina il carattere sotto il cursore |
3x | 3x = taglia 3 caratteri | Elimina il carattere corrente e i 2 successivi |
dd | delete delete = delete line | Elimina la riga corrente (finisce nel registro — e' un taglia) |
5dd | 5 delete delete | Elimina 5 righe a partire da quella corrente |
dw | delete word | Elimina dalla posizione corrente all'inizio della parola successiva |
dW | delete Word | Come dw ma ignora la punteggiatura |
d$ | delete to end | Elimina dalla posizione corrente alla fine della riga |
d0 | delete to zero | Elimina dalla posizione corrente all'inizio della riga |
d^ | delete to first char | Elimina fino al primo carattere non-whitespace |
dG | delete to end of file | Elimina dalla riga corrente alla fine del file |
d20G | delete to line 20 | Elimina dalla riga corrente alla riga 20 |
dd non e' un vero "delete" — e' un taglia. Il contenuto va nel registro e puo' essere incollato con p. Se vuoi eliminare senza salvare nel registro usa "_dd (registro blackhole).
Copiare e incollare — Normal mode#
In vim "yank" significa copiare. La y sta per yank — tirare/strappare.
| Comando | Significato | Cosa fa |
|---|---|---|
yy | yank yank = yank line | Copia la riga corrente nel registro |
5yy | 5 yank yank | Copia 5 righe a partire da quella corrente |
yw | yank word | Copia dalla posizione corrente all'inizio della parola successiva |
y$ | yank to end | Copia dalla posizione corrente alla fine della riga |
y0 | yank to zero | Copia dalla posizione corrente all'inizio della riga |
y^ | yank to first char | Copia fino al primo carattere non-whitespace |
yG | yank to end of file | Copia dalla riga corrente alla fine del file |
y20G | yank to line 20 | Copia dalla riga corrente alla riga 20 |
p | paste | Incolla dopo il cursore (o sotto la riga per dd/yy) |
P | Paste (maiuscola) | Incolla prima del cursore (o sopra la riga) |
Undo e redo#
| Comando | Significato | Cosa fa |
|---|---|---|
u | undo | Annulla l'ultima modifica |
U | Undo line | Annulla tutte le modifiche alla riga corrente |
Ctrl+r | redo | Rifai l'ultima modifica annullata |
Unire righe#
| Comando | Significato | Cosa fa |
|---|---|---|
J | Join | Unisce la riga corrente con quella successiva (aggiunge uno spazio) |
Cerca e sostituisci#
# Cerca in avanti
/parola # cerca "parola" verso il basso
?parola # cerca "parola" verso l'alto
n # prossima occorrenza (next)
N # occorrenza precedente
# Sostituisci — sintassi: :[range]s/vecchio/nuovo/[flag]
:s/vecchio/nuovo/ # sostituisce prima occorrenza nella riga corrente
:s/vecchio/nuovo/g # sostituisce tutte le occorrenze nella riga corrente
# g = global (tutte le occorrenze della riga)
:%s/vecchio/nuovo/g # sostituisce in tutto il file
# % = shortcut per "dalla prima all'ultima riga"
:%s/vecchio/nuovo/gc # chiede conferma per ogni sostituzione
# c = confirm
:1,5s/vecchio/nuovo/g # sostituisce solo nelle righe 1-5
:1,$s/vecchio/nuovo/g # equivalente a :%s ($ = ultima riga)Salvare e uscire — Command mode (:)#
| Comando | Significato | Cosa fa |
|---|---|---|
:w | write | Salva il file |
:w nomefile | write to file | Salva con nuovo nome |
:q | quit | Esci (solo se non ci sono modifiche non salvate) |
:q! | quit force | Esci senza salvare — forza l'uscita |
:wq | write quit | Salva ed esci |
:wq! | write quit force | Salva ed esci forzatamente |
ZZ | shortcut per :wq | Salva ed esci (solo se il file e' stato modificato) |
ZQ | shortcut per :q! | Esci senza salvare |
Lavorare con piu' file#
# Aprire piu' file dalla riga di comando
vim file1.txt file2.txt
# Vedere i buffer aperti
:buffers
# o equivalente:
:ls
# Passare al buffer successivo/precedente
:bn # buffer next
:bp # buffer previous
:b2 # vai al buffer numero 2
# Aprire un file aggiuntivo mentre sei in vim
:e nomefile.txt # e = edit
# Copiare contenuto da un buffer all'altro
:buffer 1 # vai al buffer 1
yy # copia la riga
:buffer 2 # vai al buffer 2
p # incollaConfigurazione — ~/.vimrc#
Il file ~/.vimrc e' il dotfile di configurazione di vim. Viene letto all'avvio.
# Contenuto minimo consigliato per ~/.vimrc
set number " mostra i numeri di riga
set relativenumber " numeri relativi alla riga corrente (utile per 5dd, 3j)
set syntax on " syntax highlighting
set tabstop=4 " tab = 4 spazi
set expandtab " converte tab in spazi
set autoindent " indentazione automatica
set hlsearch " evidenzia i risultati della ricerca
set incsearch " cerca mentre digiti
set ignorecase " ricerca case-insensitive
set smartcase " case-sensitive se la query ha maiuscole
set cursorline " evidenzia la riga corrente
colorscheme desert " schema colori (usa :colorscheme <Tab> per vedere le opzioni)# Aprire e modificare il vimrc da dentro vim
:e ~/.vimrc
# Ricaricare il vimrc senza uscire
:source ~/.vimrc
" oppure il shortcut:
:so %set relativenumber e' una delle impostazioni piu' utili per chi usa vim seriamente. Mostra la distanza relativa di ogni riga dal cursore — cosi' 5dd (elimina 5 righe) o 3j (scendi 3 righe) diventano visivamente immediati senza dover contare.
Combinazioni utili#
# Escape da shell ristretta via vim (vedi more.md e bandit-25)
:set shell=/bin/bash
:shell
# oppure direttamente:
:!/bin/bash
# Eseguire un comando shell senza uscire da vim
:!ls -la
:!python3 script.py
# Inserire l'output di un comando nel file
:r !date # inserisce la data corrente nella posizione del cursore
:r !ls # inserisce la lista dei file
# Vai alla riga N rapidamente
:42 # vai alla riga 42
42G # equivalenteScenario Reale#
Un analista deve modificare /etc/ssh/sshd_config su un server remoto senza interfaccia grafica per disabilitare il login con password. Apre il file con sudo vim /etc/ssh/sshd_config, usa /PasswordAuthentication per trovare la riga, preme n per navigare alle occorrenze, poi i per entrare in Insert mode e modifica il valore. Salva con :wq e ricarica il servizio. Conoscere vim e' l'unica opzione quando non c'e' nano installato o quando il file e' troppo grande per editor grafici.
Dove l'ho usato#
- bandit-25 — escape da shell ristretta via
more→v→ vim
Note personali#
La prima cosa da imparare e' sempre :q! — come uscire senza fare danni. Poi i per scrivere e Esc + :wq per salvare. Con questi tre comandi sopravvivi su qualsiasi server.
Esegui vimtutor nel terminale — e' un tutorial interattivo incluso in vim che insegna le basi in circa 30 minuti direttamente nell'editor.
Collegato a#
- system — categoria
- file — categoria
- more — vim e' raggiungibile da more con il tasto
v - less — less usa la stessa logica di navigazione h/j/k/l
- shell-interattiva —
~/.vimrce' un dotfile letto all'avvio


