在 Vim 插入模式下敲击 Tab 键后得到的 Tab 数

Number of Tabs I do get after striking Tab key in Vim Insert mode

我正在学习 C 编程。

我遇到了有关 vim 配置的问题。

下面是我的vim设置写在.vimrc:

set nu
set shiftwidth=4
set tabstop=4
set softtabstop=8
set autoindent
set cindent
set smartindent
syntax on

为了查看选项卡的位置,我使用了 :set list:

#include <stdio.h>$
int main(void)$
{$
^Iprintf("ab\n");$
^Ireturn 0;$ 
}$

现在在插入模式下的第 4 行,我想看看在不同位置按下 Tab 键后可以得到多少个标签。

结果如下:

当我在 n 之后点击 Tab 时,我得到 ^Iprin^I^Itf("ab\n");$.

当我在 \n 之后点击 Tab 时,我得到 ^Iprintf("ab\n^I^I");$.

以上两种情况我都比较理解

但是当我在 a 之后点击 Tab 时,我得到 ^Iprintf("a^Ib\n");$.

这超出了我的理解范围。

谁能解释一下为什么只替换了一个标签?

我认为应该有两个,因为softtabstop占用8个空间,是tabstop的两倍(4)。

这是您的 softtabstop 和(常规)tabstop 之间互动的结果。

您的 softtabstop 说当按下 Tab 键时,结果应该与 8 列的倍数对齐。当您在 a 之后按下 Tab 键时,您已经在第 13 列,因此只需一个 4 宽度的制表符就足以到达那里。在其他情况下,您分别为 16 和 8,因此需要两个 4 宽制表符才能与 8 宽软制表符对齐。

PS:如果你想要奇怪的行为(当然不推荐),设置tabstop=3 softtabstop=8。然后,当您按下 Tab 键时,您会得到 space 和制表符的组合。

PPS:所有这些都是我不喜欢文字制表符的部分原因。它们不稳定,它们的显示取决于每个开发人员的制表位设置。在我的组织中,我努力推动每个人使用 :set expandtab(或每个开发人员编辑器中的等效字符)并使用 space 字符来实现稳定和可重现的显示。在我的工作中,我唯一能容忍制表符的地方是 makefile,我别无选择。