Vim: 制表符缩进,空格对齐

Vim: Indent with tabs, align with spaces

我已经阅读了几个问题和答案:

但是其中 none 为我提供了解决方案。

我真的很想应用“Indent with tabs, align with spaces”原则,但是当涉及到自动缩进时,我没能教 Vim 如何正确地做到这一点。

考虑代码,假设tabstops == 3shiftwidth == 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;
}

是您的代码将始终显示的方式。