Можно ли исправить отступ Groovy в Vim?

Я пытаюсь использовать Vim для кода Groovy на работе. Кажется, он плохо справляется с автоотступами, когда точка с запятой не используется. Я нашел несколько вопросов, связанных с Ruby и JavaScript, с теми же проблемами, но ни одно из исправлений, которые я нашел, не работает для меня. У меня есть filetype plugin indent on в моем .vimrc, и я не устанавливаю cindent, autoindent или smartindent. Я пытался запустить setlocal nocindent nosmartindent в буфере Groovy и изменить отступ файла с помощью ggVG= на тот случай, если есть плагин, устанавливающий их за кулисами, и он все равно всегда ошибается.

Например, я получаю это на небольшом образце (из личного приложения-песочницы libGDX, которое я пишу на Groovy)

@Override
    void render () {
        Gdx.gl.glClearColor(0.75f, 0.75f, 0.75f, 1)
            Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT)
            batch.begin()
            batch.draw(img, 0, 0)
            font.draw(batch, "Testing", 300, 400)
            batch.end()
    }

Обратите внимание на дополнительные отступы после аннотации, открывающей скобки и первой строки функции. Мой .vimrc довольно сложен, но я могу опубликовать ссылку на мои dotfiles, если кто-то думает, что это поможет.


person DuckPuppy    schedule 08.07.2015    source источник
comment
Скорее всего вам просто нужно обновить vim. Какая версия вима у вас стоит?   -  person FDinoff    schedule 08.07.2015
comment
Vim 7.3.547 на Raspbian (на моем Raspberry Pi), 7.4.591 на Cygwin (скомпилирован самостоятельно), 7.3 с неизвестным уровнем исправления на OS X Yosemite и MacVim 7.4.712 показывают одну и ту же проблему.   -  person DuckPuppy    schedule 09.07.2015
comment
Кроме того, я проверил это, запустив vim -u NONE -U NONE <file.groovy> в каждой из этих версий, и вижу одно и то же поведение, поэтому я совершенно уверен, что это не плагин или одна из моих настроек .vimrc, вызывающая это.   -  person DuckPuppy    schedule 09.07.2015
comment
В вашем файле только образец? Я не могу воспроизвести его с помощью vim 7.4.712. void и } совпадают с аннотацией в первом столбце файла.   -  person FDinoff    schedule 09.07.2015
comment
Он находится в определении класса с одной другой функцией (которая также имеет ту же проблему, включая аннотацию). Если я просто помещу этот фрагмент в буфер и сделаю для него отступ, я увижу, что void и } совпадают с аннотацией, но содержимое метода по-прежнему имеет неправильный отступ. У вас есть другая проблема со всеми строками после первой внутри метода с отступом на один дополнительный уровень?   -  person DuckPuppy    schedule 09.07.2015
comment
Да. (Извините, не понял, что это было частью проблемы). Позвольте мне посмотреть, что делает vim.   -  person FDinoff    schedule 09.07.2015


Ответы (2)


В Vim нет сценария отступа для groovy. Поэтому он пытается использовать стандартные правила отступов, основанные на C. Эти правила используют точки с запятой, чтобы определить, заканчивается ли строка, поэтому вы получаете отступы продолжения строки во второй строке функции.

Поскольку vim не включает сценарий отступа, вы можете использовать подключаемый модуль groovyindent. . Размещено в ~/.vim/indent. Вам также нужно запустить dos2unix в groovy.vim, так как он содержит неправильные окончания строк.

person FDinoff    schedule 09.07.2015
comment
Вот и все, и теперь я чувствую себя немного глупо, что не нашел этого раньше. Я использую NeoBundle для управления своими плагинами Vim. Любой, кто хочет сделать то же самое для плагина groovyindent, может использовать этот фрагмент для его установки... это позаботится о запуске dos2unix в файле во время установки: gist.github.com/duckpuppy/cf5931c7abbf5389f7b9 - person DuckPuppy; 10.07.2015
comment
Теперь существует версия groovyindent для Unix: github.com/vim-scripts/groovyindent-unix - person cmcginty; 22.04.2016
comment
@cmcginty Отлично, а в Linux можно просто сделать: mkdir ~/.vim/indent/; curl https://raw.githubusercontent.com/vim-scripts/groovyindent-unix/master/indent/groovy.vim > ~/.vim/indent/groovy.vim, затем снова открыть новую вкладку vim, это вступит в силу. - person user218867; 06.09.2018
comment
Кажется, он не распознает карты и не делает отступы, есть ли для этого настройка? - person rboy; 12.09.2019

Так как groovy очень похож на упрощенный perl, для моего небольшого groovy (на самом деле nextflow DSL) кодирования установка filetype=perl с последующим gg=G работала очень хорошо.

person mestia    schedule 07.05.2021