Vim: 制表符缩进,空格对齐
Vim: Indent with tabs, align with spaces
我已经阅读了几个问题和答案:
- Vim: Use tabs for indentation, spaces for alignment with C source files
- Vim: Align continous lines with spaces
但是其中 none 为我提供了解决方案。
我真的很想应用“Indent with tabs, align with spaces”原则,但是当涉及到自动缩进时,我没能教 Vim 如何正确地做到这一点。
考虑代码,假设tabstops == 3
,shiftwidth == 3
(>--
表示制表符,.
(一个点)表示space):
{
>--long a = 1,
>-->--..b = 2,
>-->--..c = 3;
}
因此,它尽可能地用制表符缩进,然后用 space 填充其余部分。但这实际上是一种非常糟糕的做法:当有人阅读这段具有不同制表符大小的代码时,代码就会变得混乱。制表符大小等于 8 个字符时的样子:
{
>-------long a = 1,
>------->-------..b = 2,
>------->-------..c = 3;
}
太可怕了。问题是 Vim 不区分缩进和对齐。
无论制表符大小如何,为了使它看起来正确,代码应该这样缩进:
{
>--long a = 1,
>--.....b = 2,
>--.....c = 3;
}
然后,无论标签大小如何,这段代码都会看起来不错。例如,8 个字符:
{
>-------long a = 1,
>-------.....b = 2,
>-------.....c = 3;
}
如何实现?
在 Vim 中影响缩进的最有效方法是通过 'indentexpr'
。从它的 :help
:
The expression must return the number of spaces worth of indent. It
can return "-1" to keep the current indent (this means 'autoindent' is
used for the indent).
因为这个 returns space 的 数字 ,而不是呈现的缩进本身,并且 Vim 目前仅支持制表符- , space-, 或 maximal-number-of-tab-followed-by-spaces(称为 softtabstop),这是无法完成的。
所以,如果你真的想使用这种缩进方法(我个人也喜欢它的纯粹和优雅!(但我不使用它)),你必须关闭自动缩进和自动- 不幸的是,格式化并自己手动完成所有工作。
正如您已经指出的那样,vim 无法区分您是按 Tab 键缩进还是因为您正在尝试对齐文本,因此无法自动执行您想要的行为。
你能做的最接近的事情是尝试使用 softtabstop and different values for tabstop,但这样你会得到与你要求相反的结果:按一个制表符将插入尽可能多的 空格 在使用选项卡之前可以。
附带说明一下,如果您希望您的代码始终如您所愿,您可以尝试直接设置 expandtab。
空格看起来总是一样的,所以
{
.........long a = 1,
..............b = 2,
..............c = 3;
}
是您的代码将始终显示的方式。
我已经阅读了几个问题和答案:
- Vim: Use tabs for indentation, spaces for alignment with C source files
- Vim: Align continous lines with spaces
但是其中 none 为我提供了解决方案。
我真的很想应用“Indent with tabs, align with spaces”原则,但是当涉及到自动缩进时,我没能教 Vim 如何正确地做到这一点。
考虑代码,假设tabstops == 3
,shiftwidth == 3
(>--
表示制表符,.
(一个点)表示space):
{
>--long a = 1,
>-->--..b = 2,
>-->--..c = 3;
}
因此,它尽可能地用制表符缩进,然后用 space 填充其余部分。但这实际上是一种非常糟糕的做法:当有人阅读这段具有不同制表符大小的代码时,代码就会变得混乱。制表符大小等于 8 个字符时的样子:
{
>-------long a = 1,
>------->-------..b = 2,
>------->-------..c = 3;
}
太可怕了。问题是 Vim 不区分缩进和对齐。
无论制表符大小如何,为了使它看起来正确,代码应该这样缩进:
{
>--long a = 1,
>--.....b = 2,
>--.....c = 3;
}
然后,无论标签大小如何,这段代码都会看起来不错。例如,8 个字符:
{
>-------long a = 1,
>-------.....b = 2,
>-------.....c = 3;
}
如何实现?
在 Vim 中影响缩进的最有效方法是通过 'indentexpr'
。从它的 :help
:
The expression must return the number of spaces worth of indent. It can return "-1" to keep the current indent (this means 'autoindent' is used for the indent).
因为这个 returns space 的 数字 ,而不是呈现的缩进本身,并且 Vim 目前仅支持制表符- , space-, 或 maximal-number-of-tab-followed-by-spaces(称为 softtabstop),这是无法完成的。
所以,如果你真的想使用这种缩进方法(我个人也喜欢它的纯粹和优雅!(但我不使用它)),你必须关闭自动缩进和自动- 不幸的是,格式化并自己手动完成所有工作。
正如您已经指出的那样,vim 无法区分您是按 Tab 键缩进还是因为您正在尝试对齐文本,因此无法自动执行您想要的行为。
你能做的最接近的事情是尝试使用 softtabstop and different values for tabstop,但这样你会得到与你要求相反的结果:按一个制表符将插入尽可能多的 空格 在使用选项卡之前可以。
附带说明一下,如果您希望您的代码始终如您所愿,您可以尝试直接设置 expandtab。
空格看起来总是一样的,所以
{
.........long a = 1,
..............b = 2,
..............c = 3;
}
是您的代码将始终显示的方式。