Pimp my vim

Posted on Mon 18 December 2017 in code

En ce moment je suis obligé de coder sous vim.

Bien que ce soit mon éditeur préféré depuis toujours, j'ai toujours préféré des environnement plus haut niveaux tel que Qt Creator.

Néanmoins, dûe à cette obligation, je me suis dit qu'il était temps de s'intéresser à divers plugins vim afin de voir tout le potentiel du meilleur éditeur de texte de tous les temps.

ctags

On ne présente plus ctags, c'est un outil permettant de générer des fichiers tags contenant un ensemble de définitions de vos fonctions, classes, noms de fichiers. Il permet à vim de rechercher des noms de symboles.

Par défaut, ctags ne génère pas de symboles pour les noms de fichier, j'ai donc rajouté cette option dans mon ~/.ctags :

--extra=f

Comme je travaille dans des dépôts, on pourra aussi demander à ctags d'ignorer un certain nombre de répertoires :

--exclude=.git
--exclude=.hg
--exclude=.svn
--exclude=build

Attention toutefois, il semblerait que ce fichier ne supporte pas les commentaires.

Ensuite, pour la première fois rendez vous dans votre projet et exécutez :

ctags -R

Maintenant que nous avons créé nos tags, il faut les lier à vim. Pour ça nous rajoutons l'option suivante dans notre ~/.vimrc :

set tags=tags

Maintenant, ouvrez vim, vous pourrez normalement sélectionner des symboles en utilisants les fonctions suivantes :

:tag monfichier
:tag mafonction
:tag maclass

Ou avec un menu de sélection :

:ts monfichier
:ts mafonction
:ts maclass

On pourra aussi demander un split en préfixant une de ces deux commandes par s.

Gutentags

Malheureusement, contrairement à vos IDEs préférés, les tags ne se regénèrent pas automatiquement.

Plusieurs options s'offrent à nous. Nous pourrions créer un raccourci clavier vim pour les regénérer à chaque fois que l'on écrit une nouvelle fonction mais fainéants comme nous sommes nous allons utiliser un plugin s'occupant de ça.

Ce plugin recréé le fichier tags tout seul en fonction de l'écriture de fichiers. Normalement, il n'y a jamais rien à faire.

Cependant, j'ai remarqué qu'il ne regénérait pas toujours des fichiers lorsqu'on créé un nouveau. J'ai donc fait un petit raccourci vim pour le forcer :

nmap ,T :GutentagsUpdate!<CR>:redraw!<CR>

Note : j'ai rajouté :redraw<CR> car sinon la commande :GutentagsUpdate! ne me raffraichit pas l'écran.

Tagbar

Pour finir avec les tags, je vous propose le plugin tagbar.

Ce dernier affiche une fenêtre à droite avec les fonctions, classes et types du fichier courant. Il permet aussi de déplier/replier ces derniers.

Comme pour vimfiler (voir plus bas), j'ai modifié quelques paramètres pour le rendre similaire.

" Taille de 50 caractères.
let g:tagbar_width=50

" Pas besoin de message d'aide.
let g:tagbar_compact=1

" Utilise les mêmes icônes que vimfiler.
let g:tagbar_iconchars=['+', '-']

Et pour l'ouvrir, comme j'aime beaucoup les raccourcis à base de ,, j'ai utilisé ,t.

nmap ,t :TagbarToggle<CR>

Editorconfig

Les fichiers .editorconfig sont pratiques pour aider les contributeurs externes à s'adapter à votre code. Il permet d'indiquer le formattage de votre code comme par exemple :

  • nombre d'espace par indentation,
  • espaces ou tabulations,
  • fin de lignes.

Je vous laisse regarder la documentation pour voir toutes les possibilités.

Le plugin vim ne nécessite pas de configuration, installez le et profitez du résultat.

Si tout fonctionne correctement et que vous entrez dans le répertoire d'un projet contenant un fichier .editorconfig, vim devrait utiliser les paramètres associés automatiquement.

Sprunge

Sprunge est un tout petit service similaire à pastebin. Il est très simple et peut s'utiliser directement avec curl.

Il y a aussi un petit plugin qui permet d'exporter la sélection visuelle ou le fichier entier. Par défaut, il faut utiliser le raccourci <Leader>s.

CMake

Étant donné que la plupart de mes projets sont construits avec CMake, j'ai cherché un plugin améliorer l'expérience de CMake avec vim. Il y a vim-cmake qui est très simple, il ne contient que deux fonctions :

  • :CMake qui initialise vim avec CMake et met à jour le répertoire de build,
  • :CMakeClean qui fait un simple make clean.

Ce qui est bien avec ce plugin, c'est qu'il vous initialise correctement les variables nécessaire pour exécuter :make. Ainsi, une fois correctement initialisé vous pouvez construire votre projet depuis vim en tapant :make.

En bonus, vous profiterez de quickfix, vim vous pointera vos erreurs dans votre fenêtre courante.

Vimfiler

Si vous souhaitez naviguer facilement entre vos fichiers de votre projet, vous pouvez utiliser le plugin vimfiler.

Par défaut, si vous utilisez la fonction :VimfilerExplorer, une nouvelle fenêtre s'ouvrira sur votre gauche et vous permettra de naviguer dans le répertoire courant.

Les raccourcis sont similaires à vim :

  • h/l : monter ou descendre un niveau,
  • j/k : monter ou descendre dans la liste,
  • entrée : sélectionne le répertoire comme point initial de recherche ou affiche le fichier.

Pour le rendre visuellement proche du plugin tagbar, je l'ai légèrement configuré comme ceci :

" Pas de caractère | pour les derniers éléments de la liste.
let g:vimfiler_tree_leaf_icon=''

" Ouvre vimfiler avec une largeur de 50 caractères.
nmap ,e :VimFilerExplorer -winwidth=50<CR>

Clang

Si vous souhaitez avoir une complétion intelligente, il existe une multitude de plugins. Certains sont beaucoup trop complexes et trop lourd. J'ai donc opté pour un super simple qui nécessite seulement clang. Il s'agit de vim-clang.

Comme je développe en C++14, j'ai rajouté ces options :

let g:clang_c_options='-std=c99'
let g:clang_cpp_options='-std=c++14'

Le point négatif de ce plugin est qu'il est particulièrement lent, de plus par défaut il tentera de vous compléter lorsque vous taperez . ou -> après une variable. Du coup, je préfère le demander explicitement avec ^X^O.

let g:clang_auto=0

Configuration personnelle

Ensuite, pour ce qui est de vim pur, j'ai rajoutés beaucoup de raccourcis pour certaines ex-commandes :

nmap ,l :set list!<CR>
nmap ,m :wall!<CR>:make<CR>
nmap ,n :nohl<CR>
nmap ,p :set paste!<CR>
nmap ,q :q!<CR>
nmap ,Q :qall!<CR>
nmap ,s :ts <C-R>=expand('<cword>')<CR><CR>
nmap ,v :%s/\s\+$//e<CR>:nohl<CR>
nmap ,w :w!<CR>
nmap ,W :wall!<CR>
nmap ,x :x!<CR>
nmap ,X :xall!<CR>
" pour quickfix.
nmap ,cc :cc<CR>
nmap ,cl :clist<CR>
nmap ,cn :cnext<CR>
nmap ,cp :cprev<CR>
" pour cmake.
nmap ,CM :CMake<CR>
nmap ,CC :CMakeClean<CR>
nmap ,CB :let g:cmake_build_dir=

En thème j'ai opté pour [nord][nord].

Maintenant, si vous voulez voir la configuration au complète, c'est par ici que ça se passe.