我已经阅读了几个问题和答案:
但他们都没有为我提供解决方案。
我真的想要应用" Indent with tabs, align with spaces"原则,但是当谈到自动缩进时,我没有教Vim如何做到这一点。
考虑代码,假设tabstops == 3
,shiftwidth == 3
(>--
表示标签,.
(点)表示空格):
{
>--long a = 1,
>-->--..b = 2,
>-->--..c = 3;
}
因此,它尽可能地缩进标签,然后用空格填充其余部分。但实际上这是一种非常糟糕的方法:当有人用不同的标签大小读取这些代码时,代码就会搞砸了。这里的标签大小等于8个字符的样子:
{
>-------long a = 1,
>------->-------..b = 2,
>------->-------..c = 3;
}
太可怕了。问题是Vim没有区分缩进和对齐。
为了使其与标签大小无关,它应该以这种方式缩进代码:
{
>--long a = 1,
>--.....b = 2,
>--.....c = 3;
}
然后,无论选项卡大小如何,此代码都会很好看。例如,8个字符:
{
>-------long a = 1,
>-------.....b = 2,
>-------.....c = 3;
}
如何实现这一目标?
答案 0 :(得分:3)
影响Vim缩进的最有效方法是'indentexpr'
。来自:help
:
表达式必须返回值得缩进的空格数。它 可以返回“-1”以保持当前缩进(这意味着'autoindent'是 用于缩进)。
因为这会返回空格的数字,而不是渲染的缩进本身,而Vim目前只支持制表符,空格或最大数量的制表符后跟空格(称为softtabstop),这是不可能完成的。
所以,如果你真的想要使用这种缩进方法(我个人也喜欢它的纯度和优雅!(但我没有使用它)),你必须关闭自动缩进和自动格式化不幸的是,你自己手动完成所有的工作。
答案 1 :(得分:-1)
正如您已经指出的那样,vim无法区分您是否按Tab键缩进,或者因为您尝试对齐文本,因此无法自动化您想要的行为。
你可以做的最近的事情是尝试使用softtabstop以及tabstop的不同值,但这样你得到了你所要求的相反:按一个标签将插入为使用选项卡之前可以使用 space 。
另外,如果您希望代码始终如您所愿,可以尝试直接设置expandtab。
空格总是看起来一样,所以
{
.........long a = 1,
..............b = 2,
..............c = 3;
}
是您的代码始终显示的方式。