23

当使用注解缩进 java 代码时,vim 坚持这样缩进:

@Test
    public void ...

我希望注释与方法定义在同一列中,但我似乎无法找到一种方法来告诉 vim 这样做,除非可能使用缩进表达式,但我不确定是否可以将它与定期的 cindent。

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

4

3 回答 3

18

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

相反,将以下内容放入一个名为的新文件中~/.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 缩进并仅修改缩进以删除注释缩进。

于 2010-12-10T22:50:13.093 回答
10

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


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

也就是说,我的 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

我不确定这是否会破坏其他任何缩进,但它对我有用。

于 2008-10-17T11:38:52.640 回答
1

我发现 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
于 2013-12-09T14:33:50.723 回答