Sous vim, la complétion (Crtl-N) se fait par défaut sur l'ensemble des mots contenus dans le fichier en cours d'édition. L'objectif de cette page est d'expliquer la mise en place d'une solution qui, pendant l'édition d'un fichier source Java, intercepte la commande de completion, et la remplace par une recherche des méthodes appelables sur l'objet concerné.
L'idée est de modifier le compilateur java (jikes), pour qu'il soit capable de retourner la liste des méthodes disponibles.
Pour mettre en place ce système de complétion, il faut faire deux choses:
Le point de départ est jikes-1.14. La version 1.15 de jikes est incapable de compiler des inner classes.
Pour disposer d'un jikes modifié, vous pouvez, au choix:
Avec ce jikes modifié, tout appel de méthode commençant par le mot-clé magique COMPLETE interromp la compilation et affiche la liste des méthodes disponibles à ce point du code.
Par exemple, ce morceau de code:
String s; s.COMPLETEco();Provoque l'affichage suivant:
compareTo compareToIgnoreCase concat copyValueOf
Le but de la macro Vim, est donc d'utiliser cette fonctionnalité pour créer une liste de complétions, de la façon le plus transparente possible.
Voici la définition vim, à intégrer dans votre .vimrc:
function JavaCompletion() let begin = strpart( getline('.'), 0, col('.')-1 ) if begin !~ '\.[a-zA-Z_-]*$' return "\<C-N>" endif let linen = line(".") let line = substitute(begin, '\.\([a-zA-Z_-]*\)$', '.COMPLETE\1();', '') let filename = tempname() . ".java" execute "write! " filename execute "new " filename call setline(linen, line) write silent %!jikes -nowarn % 2>&1 write quit! let &dictionary=filename return "\<C-X>\<C-K>" endfunction inoremap <C-N> <C-R>=JavaCompletion()<CR>
Le travail de cette macro est de:
Pour que jikes recherche la liste des méthodes, il faut qu'il soit dans un contexte syntaxique qui lui permette de déduire qu'un appel de méthode est possible. Donc la ligne doit être une ligne d'instruction java syntaxiquement correcte.
Les exemples qui suivent montrent des cas qui marchent et d'autres qui ne marchent pas.
Fichier édité | Syntaxe intermédiaire | |||||
---|---|---|---|---|---|---|
|
|
Syntaxe correcte. | ||||
|
|
Il manque une parenthèse fermante. | ||||
|
|
Le point-virgule est mal placé. | ||||