Vim comme IDE Scala
Je suis en cours de conversion de IntelliJ Idea vers Vim, pour développer en Scala. J’ai déjà brièvement parlé de Vim et Scala dans ce billet. Le but de ce billet est de présenter comment configurer Vim pour avoir les principales fonctionnalités d’un IDE. L’utilisation de Vim en entreprise me semble assez marginale en France, comme s’en étonne Bodil Stokke dans ce tweet :
« Enterprise guys give me such a feeling of disconnect: they’re arguing IDEA vs Eclipse instead of vim vs emacs. »
Il me paraît donc important de mentionner que moult développeurs talentueux utilisent Vim. En voici quelques-uns qui sont pour moi une source d’inspiration :
- Derek Wyatt, auteur de Akka Concurrency ;
- Steve Francia, évangéliste 10gen ;
- Paul Rouget, développeur Mozilla ;
- Thibault Duplessis, développeur Scala.
Coloration syntaxique
Il suffit d’installer le plugin vim-scala. Ce plugin gère aussi l’indentation et la détection des fichiers scala.
Navigation dans le code source
ctags
est un outil classique du monde Unix. Il ne supporte pas Scala par défaut, mais il est très
simple d’ajouter ce support en créant/modifiant un fichier ~/.ctags
. Vous pouvez récupérer le
fichier ici. On peut maintenant sauter à la
définition du terme sous le curseur en tapant <C-]>
.
Alors que l’IDE recompile de manière transparente le code pour permettre la complétion, il faut
lancer ctags
à la main. Le mapping suivant permet d’effectuer cela en tapant F5
.
map <F5> :!ctags -R
Le plugin tagbar donne un aperçu de la structure du code
source du fichier courant, comme la vue structure d’IntelliJ Idea. Le langage Scala n’est pas
supporté par défaut. Il faut ajouter la ligne suivante dans le .vimrc
let g:tagbar_type_scala = {
\ 'ctagstype' : 'Scala',
\ 'kinds' : [
\ 'p:packages:1',
\ 'V:values',
\ 'v:variables',
\ 'T:types',
\ 't:traits',
\ 'o:objects',
\ 'a:aclasses',
\ 'c:classes',
\ 'r:cclasses',
\ 'm:methods'
\ ]
\ }
J’ai noté deux limites : tagbar confond méthode et variable, et les méthodes ne sont pas regroupées par objet.
Complétion
La complétion de code est native dans Vim. Les commandes sont <C-n>
pour la complétion classique
et <C-x><C-]>
pour la complétion basée sur les tags
Rechercher dans le projet
ack est un meilleur grep. Le plugin Ack.vim ajoute une
commande :Ack [options] {pattern} [{directory}]
qui permet de chercher récursivement pattern
dans directory. Les résultats alimentent le quick fix de Vim. Les mappings suivant permettent de
faciliter la navigation dans les occurrences du quick fix.
nnoremap <silent> [q :cprevious<CR>
nnoremap <silent> ]q :cnext<CR>
nnoremap <silent> [Q :cfirst<CR>
nnoremap <silent> ]Q :clast<CR>
ack
recherche par défaut dans le répertoire courant. Il est pratique de configurer son .ackrc
pour
limiter le bruit en excluant certains fichiers ou répertoires.
--ignore-dir=target
Dans IntelliJ Idea, c’est *Edit | Find | Find in Path*. |
Ouvrir un fichier
Le plugin CtrlP ajoute, entre autres, une commande :CtrlP
qui
ouvre un fichier à partir de son nom, en mode fuzzy. ctrlp trouve la racine du projet en recherchant
le répertoire .git
. Pour exclure certains fichiers ou répertoires, on utilise le wildignore
de
vim :
set wildignore=**/target/*
Dans IntelliJ Idea, c’est *Navigation | File*. |
Compilation
Je ne cherche pas à compiler depuis Vim, j’ouvre un autre terminal pour cela.
Consulter la doc
Le plugin scaladoc ouvre la Scaladoc avec la commande
:Scaladoc
.
Les fonctionnalités manquantes
Voici les fonctionnalités qui n’ont pas d’équivalent dans vim, classées par ordre d’utilité :
- complétion contextuelle : c’est la fonctionnalité qui manque le plus lorsqu’on l’on est habitué
à travailler dans un IDE, avec un langage statiquement typé. Il semble exister une possibilité
avec le plugin
neocomplcache
; - connaître le type inféré sous le curseur ;
- refactoring automatique ;
- live template : à creuser, il semble exister une possibilité avec le plugin snipmate ;
- debug : il n’est pas possible de mettre des points d’arrêt ;
- un vérificateur de syntaxe, cela semble possible avec syntastic.