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

10

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

但是它们都没有提供适合我的解决方案。

我真的想应用“制表符缩进,空格对齐”原则,但是当涉及自动缩进时,我未能教会Vim如何正确地实现这一点。

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

如何实现这个目标?

也许插件tabular可以给你想要的东西?https://github.com/godlygeek/tabular - Zach
2个回答

4
影响Vim缩进最强大的方式是通过'indentexpr'。从它的':help'中可以看到:
表达式必须返回空格缩进的数量。它可以返回“-1”以保持当前缩进(这意味着使用“autoindent”进行缩进)。
由于此返回的是空格的数量,而不是渲染的缩进本身,并且Vim迄今仅支持制表符、空格或最大制表符后跟空格(称为softtabstop),因此无法实现此操作。
所以,如果你真的想使用这种缩进方法(我个人也喜欢它的纯粹和优雅!(但我没有使用它)),你必须关闭自动缩进和自动格式化,并不幸地手动完成整个过程。

啊,太遗憾了。谢谢。也许我会尝试写信给Vim的邮件列表以及联系NeoVim开发人员,或许这个功能将来会出现。 - Dmitry Frank
除非您开发并提交完整的补丁,否则要将其添加到 Vim 中需要非常耐心;不幸的是,待办事项列表似乎永无止境。 - Ingo Karkat

-1

正如你已经指出的那样,vim 无法区分你是按 tab 进行缩进还是因为你想对齐文本,因此无法自动化你想要的行为。

你能做的最接近的事情就是尝试使用 softtabstop 和不同的 tabstop 值进行调整,但这样会得到与你要求相反的结果:按下 tab 键将在使用 tab 之前插入尽可能多的空格。

另外,如果你希望你的代码始终看起来像你想要的那样,可以直接设置 expandtab

空格始终看起来都是一样的,所以

{
.........long a = 1,
..............b = 2,
..............c = 3;
}

这就是你的代码永远呈现的方式。


这不是关于“按tab键”的问题,而是关于自动缩进的问题。显然有一种方法可以区分对齐和缩进,但Vim没有做到。至于softtabstop,感谢建议,但我不喜欢这种方法。 - Dmitry Frank
关于expandtab,它使Vim永远不使用制表符(仅插入空格)。这是我现在在我的项目中使用的方法,但这不是我想在我的问题中实现的目标。 - Dmitry Frank
我只是提醒一下,因为你所要求的无法实现,而空格是保持代码外观不受缩进和对齐影响的简单方法,这也是你最关心的问题之一。 - Mariano Macchi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接