La complétion des noms de méthodes Java sous Vim

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

Principe

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:

  1. Modifier jikes pour qu'il supporte cette nouvelle fonctionnalité.
  2. Ajouter une macro dans Vim pour appeler jikes.

Modification de jikes

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.

Macro Vim

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:

Limitations

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
myObject.toS 
myObject.COMPLETEtoS();
Syntaxe correcte.
System.err.println(myObject.toS 
System.err.println(myObject.COMPLETEtoS();
Il manque une parenthèse fermante.
System.err.println(myObject.toS )
System.err.println(myObject.COMPLETEtoS();)
Le point-virgule est mal placé.

Retour