:vim — corso in 10 lezioni
Lezione 09 di 10

Il .vimrc: farsi un Vim su misura

Vim appena installato è volutamente spartano. Bastano una trentina di righe di configurazione per renderlo comodo — e sapere cosa stai attivando è più utile che copiare il file di configurazione di qualcun altro.

Teoria

Dove vive la configurazione

Programma e sistemaFile
Vim, Linux e macOS~/.vimrc · le cose accessorie in ~/.vim/
Vim, versioni recentianche ~/.vim/vimrc, più ordinato
Neovim~/.config/nvim/init.vim (o init.lua)
Vim, Windows~/_vimrc
Vim 9.2 e successivianche ~/.config/vim/vimrc, secondo lo standard XDG

Per scoprire quale file sta usando la tua installazione, senza indovinare: :echo $MYVIMRC. E per aprirlo al volo, :e $MYVIMRC. Dopo averlo modificato, :source $MYVIMRC lo ricarica senza riavviare.

Una base ragionevole

~/.vimrc — commentato riga per riga
" --- comportamento di base ---
set nocompatible          " niente emulazione del vecchio vi
syntax on                 " colori della sintassi
filetype plugin indent on " regole diverse per linguaggio
set encoding=utf-8
set hidden                " buffer non salvati restano in memoria
set backspace=indent,eol,start
set mouse=a               " il mouse funziona, se ti serve

" --- aspetto ---
set number relativenumber " numeri assoluti + relativi (lezione 2)
set cursorline            " evidenzia la riga del cursore
set showcmd               " mostra i tasti che stai premendo
set laststatus=2          " statusline sempre visibile
set scrolloff=5           " tieni 5 righe di margine sopra e sotto
set wrap linebreak        " a capo, ma senza spezzare le parole

" --- ricerca (lezione 6) ---
set incsearch hlsearch
set ignorecase smartcase

" --- indentazione ---
set expandtab             " spazi invece di tabulazioni
set tabstop=4 shiftwidth=4 softtabstop=4
set autoindent

" --- file e ricerca file (lezione 7) ---
set path+=**
set wildmenu
set wildmode=longest:full,full
set wildignore+=**/node_modules/**,**/.git/**

" --- niente file sparsi nelle cartelle di lavoro ---
set undofile              " undo persistente tra le sessioni
set undodir=~/.vim/undo//
set directory=~/.vim/swap//
set nobackup
Le cartelle vanno create a mano, altrimenti Vim protesta a ogni apertura: mkdir -p ~/.vim/undo ~/.vim/swap. La doppia barra finale non è un errore di battitura: dice a Vim di costruire il nome del file dal percorso completo, così due file omonimi in cartelle diverse non si scontrano.
Pratica

Mappature: aggiungere i tuoi comandi

Una mappatura assegna una sequenza di tasti a un'altra. La forma da usare è quasi sempre nnoremap: n indica il modo NORMAL, nore significa «non ricorsiva», cioè non rimappare a sua volta i tasti a destra — è la differenza tra una configurazione stabile e una che si rompe quando aggiungi un plugin.

PrefissoModo in cui vale la mappatura
nnoremapNORMAL
inoremapINSERT
vnoremapVISUAL
cnoremapriga di comando
nmap, imap…versioni ricorsive: da evitare finché non sai perché ti servono

Il tasto leader

<Leader> è un tasto-prefisso per le tue scorciatoie personali, così non ti scontri con i comandi di Vim. L'impostazione predefinita è la barra rovescia; quasi tutti la cambiano nella barra spaziatrice, che è grande e non fa nulla di utile in NORMAL.

mappature che si usano davvero
let mapleader = " "

" file
nnoremap <Leader>w :w<CR>
nnoremap <Leader>q :q<CR>
nnoremap <Leader>e :e $MYVIMRC<CR>

" spegni l'evidenziazione della ricerca
nnoremap <Leader>h :nohlsearch<CR>

" muoversi tra le finestre senza il Ctrl-w
nnoremap <C-h> <C-w>h
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-l> <C-w>l

" buffer
nnoremap <Leader>b :ls<CR>:b<Space>

" in VISUAL: sposta le righe selezionate su e giù
vnoremap J :m '>+1<CR>gv=gv
vnoremap K :m '<-2<CR>gv=gv

" mantieni la selezione dopo aver indentato
vnoremap < <gv
vnoremap > >gv
Aggiungine una alla volta. Un .vimrc di trecento righe copiato da internet è pieno di scorciatoie che non userai e che ti nasconderanno comandi standard. La regola sana: quando ti accorgi di ripetere la stessa sequenza per la terza volta in un giorno, allora mappala.

I plugin, se e quando

Vim moderno carica i plugin da solo se li metti in ~/.vim/pack/plugins/start/ — un semplice git clone lì dentro basta, senza nessun gestore. Se preferisci qualcosa di più comodo, vim-plug è il più usato e sta in un file solo. Due plugin che quasi tutti finiscono per tenere: vim-surround (aggiungere e cambiare virgolette, parentesi e tag attorno a un oggetto di testo) e vim-commentary (gcc per commentare una riga, gc più un movimento).

Trucco

:verbose: chi ha impostato questa cosa?

Prima o poi succede: un'opzione ha un valore che non ti aspetti, o un tasto fa qualcosa di strano, e in mezzo hai un .vimrc, sei plugin e i file di tipo. Invece di cercare a tentoni, chiedilo a Vim.

interrogare la configurazione
:set shiftwidth?
  shiftwidth=2                          # e io ne avevo messo 4...

:verbose set shiftwidth?
  shiftwidth=2
        Last set from ~/.vim/ftplugin/html.vim line 12

:verbose map <Leader>w
  n  <Space>w    *@:w<CR>
        Last set from ~/.vimrc line 34

:verbose autocmd BufWritePre           # chi tocca il file al salvataggio

:verbose premesso a qualsiasi comando di interrogazione aggiunge la riga «Last set from», cioè file e numero di riga del colpevole. In tre secondi sai dove intervenire.

ComandoA cosa serve
:set opzione?mostra il valore corrente
:set opzione&la riporta al valore di fabbrica
:optionsapre un elenco navigabile di tutte le opzioni, con le descrizioni
:mapelenca tutte le mappature attive
:scriptnameselenca ogni file caricato, nell'ordine in cui è stato letto
vim -u NONE -N fileavvia Vim ignorando ogni configurazione: il test decisivo
Il metodo per capire se la colpa è tua o di un plugin: apri il file con vim -u NONE -N. Se il problema sparisce, è configurazione; se resta, è Vim o il file stesso. Poi si dimezza — commenta metà del .vimrc, ricarica, ripeti.