Как правильно сделать vim indent java-аннотации?

При отступе кода Java с аннотациями vim настаивает на таком отступе:

@Test
    public void ...

Я хочу, чтобы аннотация находилась в том же столбце, что и определение метода, но я не могу найти способ сказать vim сделать это, за исключением, возможно, использования выражения отступа, но я не уверен, что я могу использовать это вместе с обычный инцидент.

edit: плагин типа файла уже включен. Я просто немного запутался в плагинах с отступами. Принятый ответ может быть немного хакерским, но работает и для меня.


person wds    schedule 14.10.2008    source источник


Ответы (3)


Изменить: я не могу удалить свой собственный ответ, потому что он уже принят, но ответ @pydave кажется лучшим (больше надежное) решение.


Вероятно, вам следует использовать файл отступов для java FileType (вместо использования cindent), установив filetype plugin indent on.

Тем не менее, файл отступов, поставляемый с Vim 7.1 из моего дистрибутива Linux (смотря на текущий 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

Я не уверен, нарушает ли это какие-либо другие отступы, но это работает для меня.

person WMR    schedule 17.10.2008
comment
Это не сработало для меня - я добавил это в самом конце. Я использую vim 7.2, что я делаю не так? - person Naseer; 30.03.2009
comment
:facepalm: теперь сработало - я добавлял его в самый конец, а не в конец функции :D Спасибо! - person Naseer; 30.03.2009
comment
У меня тоже сработало. Я также изменил строку cinoptions в начале на эту: cinoptions+=(s,m1,M0,j1 - person jkramer; 22.04.2010

Вы не должны изменять встроенные настройки vim. Ваши изменения могут исчезнуть после обновления пакета. Если вы скопируете его в свой .vim, вы не получите никаких исправлений ошибок отступа Java.

Вместо этого поместите следующее в новый файл с именем ~/.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 и изменяет отступ только для удаления отступов аннотаций.

person idbrii    schedule 10.12.2010

Я нашел предложение 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
person Will Richey    schedule 09.12.2013