我能否在Vim中修复Groovy的缩进?

14

我正在尝试在工作中使用Vim编辑Groovy代码。当没有使用分号时,它似乎无法很好地处理自动缩进。我发现了一些与Ruby和JavaScript相关的问题,但是我找到的所有修复方法都对我不起作用。我在我的.vimrc文件中设置了filetype plugin indent on,并且没有设置cindentautoindentsmartindent。我尝试在Groovy缓冲区中运行setlocal nocindent nosmartindent,并使用 ggVG = 重新缩进文件,以防有插件在背后进行设置,但它仍然总是出错。

例如,在一个小样本上(来自我用Groovy编写的个人libGDX沙盒应用程序)我得到了这个:

@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 链接。


很可能你只需要更新vim。你正在运行哪个版本的vim? - FDinoff
Vim 7.3.547 在我树莓派上的 Raspbian 上,Cygwin 上的 7.4.591(由自己编译),OS X Yosemite 上未知补丁级别的 7.3 以及 MacVim 7.4.712 都显示相同的问题。 - DuckPuppy
1
另外,我已经通过在每个版本上运行vim -u NONE -U NONE <file.groovy>来进行测试,并可以看到相同的行为,因此我相当确定这不是插件或我的.vimrc设置之一导致的。 - DuckPuppy
你的文件中只有这个样例吗?我无法在vim 7.4.712中复制它。 void} 与文件的第一列注释齐平。 - FDinoff
它在一个类定义中,还有另一个函数(该函数也存在相同的问题-包括注释)。如果我只是将那个片段放入缓冲区并进行缩进,我确实看到void}与注释齐平,但方法的内容仍然未正确缩进。您是否遇到了方法内第一行后面的所有行都缩进了一个额外级别的另一个问题? - DuckPuppy
是的。(抱歉,我没有意识到这是问题的一部分)。让我看看vim正在做什么。 - FDinoff
2个回答

15

Vim没有Groovy的缩进脚本。因此,它尝试使用基于C语言的标准缩进规则。这些规则使用分号来确定一行是否已结束,这就是为什么函数的第二行会出现续行缩进的原因。

由于vim不包含缩进脚本,您可以使用groovyindent插件。将其放置在~/.vim/indent中。您还需要在groovy.vim上运行dos2unix,因为它包含了错误的行结束符。


就是这样,我现在感觉有点傻,因为我之前没有找到它。我使用NeoBundle来管理我的Vim插件。任何想要对groovyindent插件做同样操作的人都可以使用这个片段来安装它...这将在安装过程中运行dos2unix文件:https://gist.github.com/duckpuppy/cf5931c7abbf5389f7b9 - DuckPuppy
5
现在有一份Unix版本的Groovy缩进工具:https://github.com/vim-scripts/groovyindent-unix - cmcginty
@cmcginty 很好,在Linux上,可以简单地执行以下操作:mkdir ~/.vim/indent/; curl https://raw.githubusercontent.com/vim-scripts/groovyindent-unix/master/indent/groovy.vim > ~/.vim/indent/groovy.vim,然后重新打开一个新的vim标签页,它就会生效。 - Eric
它似乎无法识别和缩进地图,有没有什么调整方法? - rboy

2

由于Groovy看起来非常像简化版的Perl,对于我编写的小型Groovy(实际上是Nextflow DSL)代码,设置filetype=perl,然后跟随gg=G效果非常好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接