2008-10-14 5 views
19

Lorsque indenter code java avec annotations, vim insiste sur indenter comme ceci:Comment faire des annotations vim indent java correctement?

@Test 
    public void ... 

Je veux l'annotation d'être dans la même colonne que la définition de la méthode, mais je ne peux pas sembler trouver un moyen de dire vim pour faire cela, sauf peut-être en utilisant une expression d'indentation mais je ne suis pas sûr si je peux l'utiliser avec un cindent régulier.

edit: Le plugin filetype était déjà allumé, je viens de recevoir un peu confus au sujet des plugins indenter. La réponse acceptée peut être un peu hackish mais fonctionne aussi pour moi.

Répondre

9

Edit: Je ne peux pas supprimer ma réponse car il a déjà été accepté, mais @pydave's answer semble être la meilleure solution (plus robuste).


Vous devriez probablement utiliser le fichier d'indentation pour la FileType java (au lieu d'utiliser cindent) en mettant filetype plugin indent on. Cela dit, le fichier d'indentation fourni avec le Vim 7.1 de ma distribution Linux (en regardant le vim svn actuel est toujours vrai pour 7.2) ne tient pas encore compte des annotations. J'ai donc recopié /usr/share/vim/vim71/indent/java.vim (voir https://vim.svn.sourceforge.net/svnroot/vim/branches/vim7.1/runtime/indent/java.vim) à ~/.vim/indent/java.vim et ajouté les lignes suivantes juste avant la fin:

let lnum = prevnonblank(v:lnum - 1) 
let line = getline(lnum) 
if line =~ '^\s*@.*$' 
    let theIndent = indent(lnum) 
endif 

Je ne sais pas si cela casse l'une des autres empreintes, mais il fonctionne pour moi.

+0

Cela n'a pas fonctionné pour moi - je l'ai ajouté juste à la fin. J'utilise vim 7.2 Qu'est-ce que je fais mal? – Naseer

+0

: facepalm: travaillé maintenant - ce que j'ajoutais à la fin et non à la fin de la fonction: D Merci! – Naseer

+0

Cela a fonctionné pour moi aussi, merci. – Lyle

18

Vous ne devez pas modifier les paramètres de vim intégré. Vos modifications peuvent disparaître après la mise à niveau d'un package. Si vous le copiez dans votre fichier .vim, vous n'obtiendrez pas de correctifs de bogue d'indentation Java.

Au lieu de cela, il faut mettre dans un nouveau fichier appelé ~/.vim/after/indent/java.vim

function! GetJavaIndent_improved() 
    let theIndent = GetJavaIndent() 
    let lnum = prevnonblank(v:lnum - 1) 
    let line = getline(lnum) 
    if line =~ '^\s*@.*$' 
     let theIndent = indent(lnum) 
    endif 

    return theIndent 
endfunction 
setlocal indentexpr=GetJavaIndent_improved() 

De cette façon, il charge le tiret stock java et ne modifie que le tiret pour supprimer les tirets d'annotation.

+0

Cela fonctionne pour moi. – AMing

1

Je trouve la suggestion de pydave presque ce que je voulais, mais je voulais ceci:

@Override 
public void ... 

et ceci:

@Override public void ... 

j'ai donc remplacé l'expression rationnelle (selon, lieu de pydave en ~/.vim/after/indent/java.vim):

setlocal indentexpr=GetJavaIndent_improved() 

function! GetJavaIndent_improved() 
    let theIndent = GetJavaIndent() 
    let lnum = prevnonblank(v:lnum - 1) 
    let line = getline(lnum) 
    if line =~ '^\s*@[^{]*$' 
     let theIndent = indent(lnum) 
    endif 

    return theIndent 
endfunction 
Questions connexes