Mon (petit) vimrc adoré

Je suis, pour ceux qui le savent, du côté vimiste de la force.
Je rassure dessuite les emacsiens, je ne le critique pas, loin de là, je n’aime juste pas l’utiliser, je le trouve, à mon sens, trop compliqué.

Bref… J’ai passé pas mal de temps à chercher à « tuner » un peu mon vi(m) pour qu’il soit un peu plus sympa.
J’avais plus ou moins comme pré-requis plusieurs petites choses :

  • De la coloration syntaxique
  • De l’auto-complétion
  • De facilement me repérer dans le fichier dans lequel je travaille
  • Une identification de certain caractères spéciaux
  • Et, qu’il soit capable de me refermer les choses seul (Parenthèse, balises html, guillemets. …)
  • Ha, si ! Encore une chose qui était un pré-requis pour moi, la correction orthographique (Ça se voit non ?)

Ça fait déjà pas mal de choses, mais il y en a encore que j’ai ajouté au fur et à mesure parce que j’ai trouvé les fonctions intéressantes.
Je n’ai pas la prétention de dire que ça va plaire à tout le monde, mais bon, ça peut donner à pas mal de monde une bonne base de travail pour pouvoir utiliser vim dans un environnement plus que correct.

Je me permet directement de vous fournir une petite archive sur mon repository GIT avec dedans le vimrc et les quelques petits fichiers qui vont bien.
Vous y trouverez donc deux choses :

  • Le fichier vimrc (à mettre dans /etc/*/vimrc si vous voulez que tout le monde en profite ou dans ~/.vimrc si vous êtes égoiste)
  • Un dossier vim. Je vous conseille de le mettre dans /usr/local/share/ directement vu que le vimrc va le chercher là. Après, c’est bien entendu à votre convenance.

On commence à détailler ?

Le format et l’encodage

Tout d’abord, l’encodage. Pour moi qui met de l’UTF-8 de partout, c’est bien naturel de dire à mon vim qu’il cause UTF-8 ! Mais aussi que j’écris en format unix tans qu’à faire

set encoding=utf-8
set fileformats=unix

Couleur et affichage

Ensuite, on va mettre un peu de couleur et d’affichage en plus :

syntax on
set ruler
set showmode
set showcmd

La couleur est activé par la directive syntax on. Pour ce qui est de ruler, showmode et showcmd, respectivement ça active un barre horizontale sous la ligne active, l’affichage du mode de vim (Visual, Replace, Insert, …) et la dernière active l’affichage permanent de la barre de commande. Cette dernière directive étant nécessaire pour le showmode.

Tiens, tans qu’on est dans l’affichage, on va afficher les espaces en fin de ligne et les espaces insécables, puis aussi les matchs des recherches tiens et tiens, les caractères spéciaux:

highlight RedandantSpaces ctermbg=lightred guibg=red
set hlsearch 
if &term =~ "linux"
	set list listchars=nbsp:+,tab:\|·,trail:·,extends:>,precedes:<
else
	set list listchars=nbsp:¬,tab:\⎢·,trail:·,extends:>,precedes:<
endif

L’historique et le backup c’est le bien

Hé, ça vous arrive de vous tromper et de ne vous en rendre compte qu’après ? Moi oui, donc j’ai trouvé l’astuce :

set undolevels=256 
set backup

Je vous vois venir là, vous êtes en train de vous dire « Mais il manque encore beaucoup de choses par rapport aux pré-requis sus cités ?! »
Quenéni, c’est juste que je n’en ai pas encore parlé !
Bon, ok j’y vais.

La numérotation intelligente

Des chiffres ! Oui, mais pas n’importe comment !
Beaucoup utilisent les numérotations classiques de vim (Le coup du :set number).
Bah moi non ! Pourquoi, parce que je suis un flemmard à des moments. Et qu’en plus, c’est marqué en bas à droite, donc c’est pas marrant.

Je fais un truc plus sympa, la numérotation relative à ma position courante dans le fichier !
Quésaquo ? Bah simplement, la ligne où je suis, c’est la ligne 0 celle de dessous c’est 1 et celle de dessus c’est 1 aussi. (What ?)
Oui oui, vous savez quand vous faite du copy/cut de lignes dans vi(m), c’est du genre :y8 (Pour la ligne plus les 8 suivantes).
Bah c’est ça, ça vous affiche les lignes comme ça :

5
4
3
2
1
0 set relativenumber
1
2
3
4
5

C’est mignon non ?

Bon, on passe à des trucs vraiment utile pour les devs/codeurs/…

La flemmardise c’est cool !

Quand j’utilises des caractères comme les parenthèses, les crochets, les < >, …, j’aime bien ne pas passer 30s à chercher le caractère associé (fermant ou ouvrant). Donc j’ai trouvé la solution.
Tout d’abord, afficher les pairs, c’est pratique, et c’est une option de vim.
Mais aussi je me suis dit, pourquoi ne pas les refermer d’office quand je les ouvres comme ça c’est plus simple (flemmard bis) ?

La deuxième option est un peu plus complexe à configurer parce qu’il faut déclarer des matchs, mais n’ayez craintes, je vous fournis les confs ;)

set showmatch 
	inoremap { {}<left>
	inoremap { {<CR>}<Esc>O
	inoremap { {<Right>
	inoremap {{ {
	inoremap {} {}

Bon, ne vous inquiétez pas, je vous fournis le fichier, rappelez vous au début de l’article !

Pratique non ?

Un peu de complétion de mot ? Voire de balises ?
Pas de secret, ce sont deux plugins vim :

autocmd FileType html,htmldjango,jinjahtml,eruby,mako,php let b:closetag_html_style=1
autocmd FileType html,xhtml,xml,htmldjango,jinjahtml,eruby,mako,php source /usr/local/share/vim/closetag.vim

runtime! /usr/local/share/vim/word_complete.vim

L’idée (pour la complétion de mots) m’est venu du fait que je fais pas mal de bash/perl, et avec les variables, ça devient vite n’importe quoi…
Donc pour éviter de se tromper, c’est super pratique.
Pour ce qui est de la complétion de balise, c’est vraiment pas compliqué. On écrit sa balise ouvrante, et pour la fermante, on commence simplement à la fermer, il la complétion fera le reste.

On a à peu près fait le tour non ?
Ah non, la correction orthographique !
Aller, on y va !

Tans qu’à faire, autant écrire correctement non ?

Personnellement, j’écris beaucoup en français et en anglais, donc j’avais besoin d’avoir les deux langues de disponibles ET commutables.
Pour l’activation de la correction, rien de vraiment bien compliqué. Ça tiens sur une ligne.
Pour la commutation des langages, c’est un peu moins cool parce qu’il faut faire une fonction (Qui soit dit en passant est relativement simple)

nnoremap  :setlocal spell!
nnoremap  :call ToggleSpellLang()

function! ToggleSpellLang()
	if &spelllang =~# 'en'
		:set spelllang=fr
	else 
		:set spelllang=en
	endif
endfunction