为什么在 vim 插入模式下输入大括号会使行向左缩进?

Why does typing a curly brace in vim insert mode indent the line to the left?

即使是空的 .vimrc

也会发生这种情况

当处理扩展名为 .html 的文件时,如果它当前处于此状态:

<p>
    t
</p>

然后我将光标放在“t”上,按 a(追加)

<p>
    t_
</p>

然后键入“{”,该行将向左缩进,结果如下:

<p>
t{_
</p>

我的光标仍在“_”处处于插入模式

我试过在各种 vim 帮助文件中查找“缩进”和“{”,但我找不到任何关于它自动向左缩进的原因。

有什么方法可以禁用此自动左缩进吗?

您的缩进由一个名为 HtmlIndent() 的函数处理。如果您从命令行用 vim --clean testIndent.html 打开 vim,然后在 vim 中键入 :set indentexpr? 并按回车键,您将看到 indentexpr=HtmlIndent()。请参阅 :h indentexpr 以了解有关此设置含义的更多信息。至于该函数的作用,您需要查看它的定义位置。您可以将 :e $VIMRUNTIME/**/indent/html.vim 键入 vim 并(在按回车键之前)按 Tab 键。 Vim 应自动填写 vim 的 html 缩进文件的位置。对于 Ubuntu 和 vim 8.2 的我,这是在 /usr/local/share/vim/vim82/indent/html.vimHtmlIndent() 函数在那里定义。

这是答案的第一部分。第二部分回答了为什么通过输入 { 字符触发缩进。 HtmlIndent() 确定行的缩进应该是什么,但是 indentkeys 设置会触发一行的正确缩进,以便在键入某些键时对其进行评估和设置。参见 :h indentkeys。如果您使用 vim --clean testIndent.html 再次打开 vim 并键入 :set indentkeys?,您将看到类似 indentkeys=o,O,<Return>,<>>,{,},!^F 的内容。该设置中的 { 字符导致 vim 通过 HtmlIndent() 评估它认为每次键入 { 时所在行的正确缩进。

鉴于此,您有多种选择。您可以寻找对 vim 的 html 缩进设置进行了自己添加的人。您可以简单地禁用此自动缩进。您可以尝试修改 vim 的 HtmlIndent() 函数。一个非常简单的选择是从 indentkeys 设置中删除 { 字符。您可以使用 :set indentkeys-={ 执行此操作。然后再次执行 :set indentkeys? 以验证 { 已被删除。你可以用同样的方法删除 }。请注意,这只会阻止 vim 在您每次键入 {, } 字符时自动重新缩进一行。它实际上不会改变 vim 关于该行缩进应该是什么的意见,因此在 vim 评估和设置行缩进的其他情况下,它仍然会以您不同意的方式这样做。