Vim comme IDE Scala
Après un an de pratique, voici une mise à jour de mon article sur Vim et 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, évangeliste 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. Il permet aussi de classer les import avec
la commande :SortImportScala
. Seul bémol, l’indentation automatique avec =
ne fonctionne pas
correctement, notamment avec l’accolade fermante. Mais nous verrons un contournement au paragraphe
formateur.
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. Mais la configuration est apportée par le plugin vim-scala.
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
Cependant, je vous recommande d’installer neocomplete qui offre la completion lors de la frappe (as-you-typed).
Snippet
Le plugin neosnippet offre des snippets de code et s’intègre très bien avec neocomplete. C’est l’équivalent des Live Templates avec IntelliJ.
Syntastic
Le plugin syntastic offre la vérification du code Scala à la volée. Il utise le parser de scalac et est assez lent. Je préfère utiliser la méthode décrite dans compilation.
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 avec SBT pour cela. Il existe cependant un wrapper SBT qui permet de récupérer les erreurs de compilation dans le quickfix de Vim.
Consulter la doc
Le plugin scaladoc ouvre la Scaladoc avec la commande
:Scaladoc
.
Le formateur syntaxique
Vim permet de configurer un programme externe pour formater le texte avec l’opérateur gq.
scalariform est un formatteur pour Scala. Il suffit juste
d’ajouter la ligne suivante dans son .vimrc
au BufEnter *.scala setl formatprg=java\ -jar\ ~/scalariform.jar\ --stdin\ --stdout
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 ;
- debug : il n’est pas possible de mettre des points d’arrêt ;
Reste à faire
Tester use scalariver pour améliorer les performances de scalariform.