“ softtabstop”是用来做什么的?


21

我已经知道Vim中与标签有关的设置:

  • ts
  • sw
  • expandtab
  • smarttab
  • sts

我的正常设置是set ts=4 sw=4 expandtab smarttab

但是根据sts文档,如果expandtab未设置,它将尝试使用空格和制表符的组合来构成制表符大小的所需空白数。

对于这种设置,我真的想不出一个有用的方案:为什么有人想拥有固定数量的制表符和空格,而这些制表符和空格可能会使事情搞砸了?我能想到的唯一好处是减少了字符数,从而减小了文件大小,这对我来说似乎很奇怪。

Answers:


20

softtabstop文档所述,如果要保持默认制表位的大小为8,但编辑文件时就像制表位的大小是其他值一样,则很有用。例如,如果您在编辑代码时希望缩进级别为4,但是某些注释具有制表符缩进的文本,例如表格,该表取决于制表符停止位8,则可以设置sts4

我注意到您的标签设置(set ts=4 sw=4 expandtab smarttab)和sts(例如set ts=8 sts=4)的使用之间的区别是在文本行中间的空白处退格。例如,考虑下面的文本行,其中·表示空格:

some·text·······more·text

在插入模式时,之前只是移动光标mmore text。使用您的设置,按Backspace删除一个空格。但是在使用时sts=4,Backspace会删除所有到上一个制表位的方式,因为如果空格是制表符,它就会表现出来。

您可以sts=4在设置之外进行设置,并在不混合制表符和空格的情况下获得中线退格键行为。制表符将被扩展为四个空格,但是您可以在一行中间的一系列空格中退格。


3

请参见下面的示例,

// Start vim without loading your vimrc. set only tabstop=8 softtabstop=4.
// This makes <Tab> in insert mode equals to 4 <Space> length at max.

// In insert mode, type 12, one <Tab>, 5. We get insertion below,
12··5
// Quit insert mode. Move cursor back, we find 2 <Space> inserted.

// In insert mode, type 12, two <Tab>, 9. We get insertion below,
12······9
// Quit insert mode. Move cursor back, you find a <Tab> inserted.

// In insert mode, type 12, three <Tab>, 3. We get insertion below,
12··········3
// Move the cursor back, you find a <Tab> and 4 <Space> inserted.

// We can even set sotftabstop=12, but this time we only need type one <Tab>, then 3.
12··········3
// Move the cursor back, you find a <Tab> and 4 <Sapce> inserted.

因此,定义tabstopa的宽度Tabsofttabstop多少,而键入时 光标移动了多远Tab。如果未将它们设置为相同的值,则表示如果您敲击了Tab按键,则并不意味着一个简单的Tab字符。无论如何,一旦退出插入模式,由vim决定。Vim首先将尝试尽可能多地匹配插入tabstop;如果最后还是无法充实tabstop,vim只会补偿Space

多说一点,如果您设置expandtab,就等于对vim说:

请不要懒得去计算有多少TabSapce需要。只需插入Space


您的答案似乎像是在咆哮,似乎无法回答问题。
赫尔·沃尔夫

@Herb Wolfe希望我的回答可以帮助PO找出进行类似异常设置时会发生什么:set st=7 sts=13。由于vim不仅是为编码而设计的,而且最初是为文本编辑而设计的。

1

简单答案:

例如,它对于编程非常有用,尤其是在制表至关重要的Python中。当按sts = 4按下退格键时,它将取消制表符行,而不删除单个空格字符。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.