programming happydev vim dotfiles configurations

Vim, quattro mesi dopo

Non si smette mai di configurare vim, ma sono a buon punto

Ho iniziato a usare vim circa quattro mesi fa, non da subito per lavoro. Infatti è decisamente frustrante usarlo all'inizio, visto che niente è user friendly e sicuramente questo non aiuta quando si cerca di essere produttivi.

Nella prima settimana mi limitavo a fare qualche prova con i movimenti. Poi, un po' alla volta ho cominciato ad usarlo veramente, prima per scrivere documentazione in markdown, poi per modificare qualche file di configurazione nei server... e una volta ingranato discretamente, per sviluppare in C++ e Javascript.

Non è stato facile, durante i primi giorni ho passato molto tempo ad aggiungere cose al mio vimrc. Il primo errore che ho fatto è stato partire dal vimrc di qualcun altro, non ricordo chi, perché mi sembrava il più vicino alle mie esigenze. Presto mi sono accorto che avevo copiato configurazioni per me inutili o addirittura controproducenti.

Quindi, se ti stai avventurando a provare vim, il primo consiglio è: parti da un vimrc vuoto, e non aggiungere niente se non sai esattamente qual è il significato.

Il secondo consiglio è: non installare subito troppi plugin e non provare a impararli tutti subito. Vim è completamente diverso dagli altri editor e voler far tutto subito può essere molto stressante.

All'inizio mi ero fatto prendere la mano, ma poi ho cambiato approccio, provando una sola funzione per volta. In questo modo ho potuto imparare più approfonditamente le funzionalità di vim e dei plugin. Ho dato modo alla memoria muscolare di entrare in funzione.

Aver mappato il CapsLock su Esc è stata una grande idea, senza avrei stressato troppo il mignolo sinistro. Forse non avrei nemmeno continuato ad usare vim.

Altra grande idea è stato mappare lo spazio come leader key di vim. All'inizio avevo provato a usare il backslash (che è il leader predefinito). Poi ho provato con la virgola, che molti utenti vim consigliano, ma entro pochi giorni ho capito che il più comodo era la barra spaziatrice. È un tasto raggiungibile da entrambi i pollici, è il più grande e ha la stessa funzione del tasto L, quindi non si perde niente.

Se non hai capito di cosa sto parlando, probabilemte sei alle prime armi con vim e non hai ancora scoperto cos'è il leader. In pratica è un pulsante della tastiera che inizia le sequenze custom, quelle che crea l'utente. In questo momento, dopo quattro mesi, ho mappato diverse sequenze che iniziano con il leader. Se un giorno volessi cambiare il leader, tutte queste sequenze verrebbero rimappate sul nuovo tasto. Ma cosa ancora più utile, posso condividere le mie shorcut con altri utenti che usano leader diversi.

Ogni giorno cerco di capire quali sono i comandi che uso di più e provo a mapparli su una sequenza iniziata dal leader.

Ad esempio, nel mio vimrc:

" Change leader to a more efficient button
let mapleader = "\<Space>"

" Close buffers without pain
nnoremap <silent> <leader>x :bd<CR>

" Save without pain
nnoremap <silent> <leader>w :w<CR>

In questo modo chiudo il buffer corrente con <space>x e salvo con <space>w.

All'inizio ero tentato di mappare il <Ctrl-s> come si usa in molti programmi. Ma la scelta di rimanere nella vim way ha pagato. Le sequenze sono molto più comode delle combinazioni. Almeno questo è quello che dice la vim way. Qualcuno non è d'accordo, come quegli strani individui che usano emacs.

vimrc, dopo quattro mesi

La prima volta che si apre vim, diciamoci la verità, è proprio brutto!

vim, la prima volta

Soprattutto per l'utente che non l'ha mai usato, è disarmante. Parte in normal mode, quindi appena si inizia a scrivere, non scrive, ma esegue comandi. Se ti sta passando per la testa di configurarlo in modo che parta in insert mode... non farlo! Non per posizione presa, ma perché se vuoi veramente essere produttivo con vim devi capire che, come dice il nome, è normal la modalità in cui bisogna stare per la maggior parte del tempo.

Però tutto il resto è strano. Per esempio il backspace che non cancella. Che diavoleria è mai questa? Allora ci sono un po' di impostazioni che si possono aggiungere al vimrc per avere un editor un po' più normale, ma senza snaturarlo dalla sua vim-essenza.

set autoindent " always set autoindenting on
set autoread " Make Vim automatically open changed files
set backspace=indent,eol,start " allow backspacing over everything in insert mode
set clipboard=unnamed " yank to clipboard
set colorcolumn=80,120 " show columns at 80 and 120
set completeopt=menu,menuone " complete menu visibility
set cursorline " Highlight current line
set diffopt+=vertical
set expandtab " expand tabs to spaces
set exrc secure " per-directory .vimrc files, unsafe commands disabled
set foldenable " enable folding
set foldlevelstart=10 " open most folds by default
set foldnestmax=10 " 10 nested folders max
set gdefault " assume the /g flag on :s substitutions to replace all matches
set hidden " Set hidden to allow buffers to be browsed
set history=8192 " With a powerful PC, we can have a huge history.
set hlsearch " Highlight search results
set incsearch " as I start to search, the file jumps to the match as I type.
set lazyredraw " only redraw when needed
set list " Show invisible characters
set listchars=eol:¬,tab:▸\ ,trail:·,nbsp:⎵ " Use these symbols for invisible
set modelines=1 " The number of lines that is checked for set commands
set noautochdir " Prevent changing directory when opening files
set noerrorbells " Disable error bells
set noesckeys " (Hopefully) removes the delay when hitting esc in insert mode
set nospell " Disable spell check
set nostartofline " Don’t reset cursor to start of line when moving around.
set nowrap " turn off soft wrap
set number " Show line number
set relativenumber " ...but show relative numbers except for the current line
set ruler " Show ruler on the statusline
set scrolloff=8 sidescrolloff=15 sidescroll=1 " When to start scrolling
set shiftwidth=2 " indent by 2 spaces
set shortmess=I " I: no intro message.
set showcmd " Show command line
set showmatch " highlight matching [{()}]
set showmode " Show mode
set smartcase "don't ignore Capitals when present
set splitright " ensures new splits are to the right of current
set tabstop=2 " The default is 8 which is MASSIVE!!
set tags=./.tags;,.tags; " tags files are hidden
set textwidth=0 wrapmargin=0 " turn off hard line wrapping
set title " Vim sets terminal title
set ttimeout " removes the delay when hitting esc in insert mode
set ttimeoutlen=1 " removes the delay when hitting esc in insert mode
set ttyfast " sends more characters to the screen for fast terminal connections
set wildmenu " visually autocomplete the command menu
set wildmode=list:longest,list:full " Show a list of completions

Ho scritto di fianco ad ogni opzione il significato. Lo ammetto, ho aggiunto alcune di queste righe senza conoscerne il significato. Poi però mi son preso la briga di capirle, ed è per questo che aggiunto un commento a fianco.

Ho aggiunto parecchi plugin, soprattutto per C++ e Javascript, i linguaggi con cui lavoro più frequentemente. Ho aggiunto anche molti plugin multi-purpose, come il fantastico ctrlp per il fuzzy search di file. I plugin sono gestiti da un gestore di plugin, nel mio caso Vundle, che è stata una scelta abbastanza casuale fra i vari plugin disponibili.

Il tema

Il tema! Arrivando da SublimeText ho installato un tema per vim che assomigliasse il più possibile a quello predefinito di ST3, che ha dei colori che mi piacciono tanto, sia per la leggibilità, ma soprattutto per l'estetica. Il tema è molokai.

Altra cosa strana è stata l'aggiunta di un font ricco di icone utf8, come quelli che si trovano nella collezione nerd fonts.

Le frecce

Ho disabilitato le frecce:

" Disable arrows and mouse wheel in insert mode
inoremap <silent> <ESC>OA <Nop>
inoremap <silent> <ESC>OB <Nop>
inoremap <silent> <ESC>OC <Nop>
inoremap <silent> <ESC>OD <Nop>

Non l'ho fatto subito, all'inizio le usavo al posto di hjkl per il movimento. Molti consigliano di disabilitarle subito, ma credo che sia una scelta troppo drastica. Già si è impacciati a imparare tutto il resto, metterci anche hjkl è troppo. Comunque alla fine le ho disabilitate. Non ne sento la mancanza. Come conseguenza collaterale ho anche sistemato quella cosa fastidiosa che mi faceva la rotellina del mouse in insert mode: mi inseriva OAOAOAO a non finire!

Completamento automatico

Ho abilitato il completamento automatico con YouCompleteMe e il controllo sintassi automatico con Syntastic. Entrambi, se ci sono i giusti programmi installati, funzionano sia con C++ che con JS e molti altri linguaggi.

Snippet

Ho creato degli snippet per UltiSnips: ogni volta che mi trovo a inserire più volte la stessa cosa, creo uno snippet e lo collego ad una shortcut.

Ad esempio, per Qt, ho fatto questo snippet:

snippet qprw
Q_PROPERTY(${1} ${2} READ $2 WRITE set${2/\w+\s*/\u$0/} NOTIFY $2Changed);
endsnippet

Dove ${1} è il tipo e ${2} è il nome della variabile e quella cosa strana scritta dopo set non significa altro che rendere maiuscola la prima lettera del {2}.

Così, se scrivo qprw bool visible, mi appare magicamente:

Q_PROPERTY(bool visible READ visible WRITE setVisible NOTIFY visibleChanged);

Il mio primo plugin

Ho imparato a usare le macro. Ho promosso alcune macro a funzioni. Ho promosso alcune funzioni a plugin. Il passo è stato breve: scrivere vim-gtest è stato più semplice di quanto pensassi.

tmux

Ho integrato vim e tmux. Visto che vim funziona da terminale, ho la possibilità di fare tantissime cose che normalmente farei con zsh. Con tmux è ancora più divertente, perché è possibile dividere il terminale in diverse sezioni. Alcuni plugin sfruttano il terminal multiplexer per gestire operazioni in background (come dispatch). Per esempio, il mio vim-gtest usa tmux per lanciare i test senza uscire da vim.

TL;DR

In poche parole... in quattro mesi ho messo quotidianamente mano al vimrc, oltre che al tmux.conf e allo zshrc. Ormai il mio vimrc è abbastanza stabile, le aggiunte che faccio son veramente poche. Spesso tolgo qualcosa che ho smesso di usare perché sono diventato un utente vim più esperto. Probabilmente non smetterò mai di ritoccarlo. Se vuoi vedere in dettaglio il mio vimrc, lo trovi, sempre aggiornato, fra i miei dotfiles in github. Ho cercato di spiegare il più possibile il perché di ogni riga/sezione del vimrc. Sentiti libero di scopiazzarlo, ma non senza aver prima capito il perché.

vim, dopo quattro mesi

Ti è piaciuto l'articolo? Condividilo! Commentalo!

comments powered by Disqus