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