vim 缩进 html 标签,属性分行

vim indent html tags with attributes on separate lines

我正在用 vim 编写一些 html/vue 代码,但我发现自动缩进功能没有按预期工作,尤其是嵌套标签和属性被分成多行时。

我阅读了 coding standard 同意的长 html 标签,我认为如果 vim 可以支持这样的缩进样式就好了。 我发现有多个类似的问题被问到 this,但他们没有给出令人满意的答案。 我也试过 html5 plugin 换 vim,但似乎没什么用。

例如,我希望vim缩进如下:

<template>
    <my-tag 
        attr1
        attr2
        attr3>
        <my-sub-tag
            attr1
            attr2
            attr3>
        </my-sub-tag>
    </my-tag>
</template>

但是目前,当我按下 gg=G 时,它会缩进成这样:

<template>
    <my-tag 
     attr1
     attr2
     attr3>
        <my-sub-tag
      attr1
      attr2
      attr3>
        </my-sub-tag>
    </my-tag>
</template>

是否有相对快速的修复方法(比如一个不错的插件),或者它还不是 vim 的主要关注点?

您不必为此使用插件!当您使用 gg=G 时,equalprg(参见 :h 'equalprg')是 运行。如果未设置此选项,它将使用默认或内置的 equalprg,这就是为什么您会看到奇怪的缩进,因为它们不是为 html 构建的。

您可以使用更能格式化特定文件类型的外部程序。例如,对于 html 您可以使用 html-beautify (npm install --global html-beautify) 对于 css、json 和其他您使用 prettier

您可以执行以下操作来使用外部程序。

:setlocal equalprg=html-beautify -f - -I -s 2

较新版本的 prettier 也支持 html 格式化。

:setlocal equalprg=prettier\ --stdin\ --parser=html

将此添加到 ~/.vim/after/ftplugin/html.vim 并使用相同的命令 gg=G 来格式化行。

另请参阅 :h 'formatprg':h gq 命令。