Yann Moisan

Scala, Web, Linux…

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 :

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é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. Mais la configuration est apporté 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 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 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.

Sources