如何正确地使vim缩进java注释?

问题描述:

缩进时带注解的Java代码,VIM坚持缩进这样的:如何正确地使vim缩进java注释?

@Test 
    public void ... 

我想要的注释是在同一列的方法定义,但我似乎无法找到一种方法来告诉VIM要做到这一点,除了可能使用缩进表达式,但我不知道是否可以将它与常规cindent一起使用。

编辑:filetype插件已打开我对缩进插件有点困惑。被接受的答案可能有点骇人听闻,但也适用于我。

编辑:我不能删除我自己的答案,因为它已被接受,但@pydave's answer似乎是更好(更强大)的解决方案。


通过设置 filetype plugin indent on,您可能应该使用java FileType的缩进文件(而不是使用cindent)。

也就是说,我的linux发行版中的Vim 7.1的压缩文件(查看当前的vim svn,对于7.2仍然是这样)还没有考虑注释。因此,我复制/usr/share/vim/vim71/indent/java.vim(见https://vim.svn.sourceforge.net/svnroot/vim/branches/vim7.1/runtime/indent/java.vim)到~/.vim/indent/java.vim并添加以下行权结束前:

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

我不知道这是否破坏任何其他缺口,但它为我工作。

+0

这对我没有用 - 我在最后添加了它。我正在使用vim 7.2 我在做什么错? – Naseer 2009-03-30 09:59:53

+0

:facepalm:现在工作 - 我正在添加它在最后,而不是在函数的结尾:D 谢谢! – Naseer 2009-03-30 10:04:12

您不应该修改内置的vim设置。软件包升级后,您的更改可能会消失。如果你将它复制到.vim中,那么你将不会得到任何java indent错误修复。

相反,把以下到一个新文件名为~/.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() 

它加载股票java的缩进,只修改缩进删除注释缩进的方式。

我发现pydave的建议几乎我想要的东西,但我想这一点:

@Override 
public void ... 

这样的:

@Override public void ... 

所以我取代了正则表达式(按pydave的,地点在~/.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