Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vim:用制表符缩进,用空格对齐_Vim_Alignment_Indentation_Auto Indent - Fatal编程技术网

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

Vim:用制表符缩进,用空格对齐,vim,alignment,indentation,auto-indent,Vim,Alignment,Indentation,Auto Indent,我已经阅读了几个问题和答案: 但没有一个能为我提供解决方案 我真的很想应用“”原则,但当涉及到自动缩进时,我没能教Vim如何正确地做到这一点 考虑代码,假设tabstops==3,shiftwidth==3 (--表示制表符,(一个点)表示空格): 因此,它尽可能多地使用制表符缩进,然后用空格填充其余部分。但这实际上是一种非常糟糕的方法:当有人以不同的选项卡大小阅读此代码时,代码将被弄乱。以下是制表符大小等于8个字符时的外观: { >-------long a = 1, >-

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

但没有一个能为我提供解决方案

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

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

如何实现这一点?

影响Vim缩进的最有效方法是通过
'indentexpr'
。从其
:help

表达式必须返回值为缩进的空格数。信息技术 可以返回“-1”以保持当前缩进(这意味着“自动缩进”是 用于缩进)

由于这返回的是空格数,而不是呈现缩进本身,而且Vim目前仅支持制表符、空格或最大制表符数,后跟空格(称为softtabstop),因此无法执行此操作


因此,如果你真的想使用这种缩进方法(我个人也喜欢它的纯净和优雅!(但我不使用它)),很遗憾,你必须关闭自动缩进和自动格式化功能,自己手动完成全部工作。

正如你已经指出的,vim无法区分您是按tab键缩进,还是因为您试图对齐文本,因此无法自动执行所需的行为

您可以做的最接近的事情是尝试使用和使用不同的值,但这样做的结果与您要求的相反:在使用选项卡之前,按选项卡将插入尽可能多的空间

另一方面,如果您希望您的代码始终像预期的那样,您可以尝试直接设置

空间看起来总是一样的,所以

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

这是代码始终显示的方式。

这不是关于“按tab键”,而是关于自动缩进。很明显,有一种方法可以区分对齐和缩进,但Vim不能做到这一点。至于softtabstop,谢谢你的建议,但我不喜欢这种方法。至于expandtab,它使Vim从不使用制表符(只插入空格)。这是我这些天在我的项目中使用的方法,但这不是我想在我的问题中实现的。我只是以防万一地指出了这一点,因为你要求的东西无法实现,而空格是保持代码外观的一种简单方法,不管缩进和对齐如何,这是你主要关心的问题之一。啊,太糟糕了。谢谢可能我会尝试写信给Vim的邮件列表,并联系NeoVim的开发人员,可能这个功能将来会出现。除非你开发并提交一个完整的补丁,否则你必须非常耐心才能将它输入Vim;不幸的是,待办事项列表是无限长的。也许插件列表会给你你想要的东西?
{
.........long a = 1,
..............b = 2,
..............c = 3;
}