为什么在 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.vim
。 HtmlIndent()
函数在那里定义。
这是答案的第一部分。第二部分回答了为什么通过输入 {
字符触发缩进。 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 评估和设置行缩进的其他情况下,它仍然会以您不同意的方式这样做。
即使是空的 .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.vim
。 HtmlIndent()
函数在那里定义。
这是答案的第一部分。第二部分回答了为什么通过输入 {
字符触发缩进。 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 评估和设置行缩进的其他情况下,它仍然会以您不同意的方式这样做。