Yann Moisan

Scala, Web, Linux…

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 :

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écuperer 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 occurences 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.

Sources