这最后一点让我想知道:有一个实际的情况下,你不会想要shiftwidth == tabstop&& tabstop == softtabstop?我不能想到一个。就我而言,如果我可以设置所有3的这些都是一样的值,在一个单一的任务将是最方便的。例如呼叫:
:set stab=4
这将相当于运行:
:set tabstop=4 softtabstop=4 shiftwidth=4
任何人都可以建议如何这样做?
更新
感谢您的回复,因为太多的PHP,hobbs和kaiser.se。我不是单独回复每个人,我在这里更新问题。
带有expandtab的Softtabstop已关闭
我上面说,expandtab关闭,按Tab键插入与softtabstop匹配的最小可能数量的制表空格字符。我坚持,但我认为我需要解释我的意思。我将通过几个例子尝试这样做。要继续,请运行:set list,以便您可以查看制表符字符。
tabstop = 4 softtabstop = 2 shiftwidth = 4 noexpandtab
在插入模式下,按Tab键可插入2个空格字符。再次按Tab键,而不是插入两个空格字符(总共4个空格字符),而是用一个制表符字符替换前面的2个空格。 Tabstop设置为4,因此单个制表符字符的宽度与4个空格相同。
tabstop = 4 softtabstop = 6 shiftwidth = 4 noexpandtab
在插入模式下,按Tab键会插入1个制表符字符加2个空格。制表符字符的宽度为4,因此总宽度为6,这是使用3个字符实现的。再次按Tab键将插入两个制表符,并删除先前插入的两个空格。总宽度为12,这是使用3个字符实现的。
在这两个示例中,Vim插入与softtabstop匹配的最小可能数量的制表符空格字符。
如果我使用expandtab关闭,我不能看到自己想要额外的粒度控制,可以通过设置softtabstop到一个不同的值从tabstop实现。对我来说,仍然可以使用单个命令将tabstop,softtabstop和shiftwidth设置为相同的值。
expandtab是否使softtabstop冗余?
tabstop = 4 softtabstop = 0 shiftwidth = 4 expandtab
在插入模式下,按Tab键可插入4个空格。按删除键删除一个空格 – 所以如果你意外碰到Tab键,你必须退格4次。
tabstop = 4 softtabstop = 4 shiftwidth = 4 expandtab
在插入模式下,按Tab键可插入4个空格。按退格键将删除4个空格。
如果我使用expandtab打开,我更喜欢删除键删除与tab键插入相同数量的空格。所以在这种情况下,我觉得能够同时为tabstop,softtabstop和shiftwidth分配相同的值也是有用的。
快捷方式仍然有用
伟大的Vim提供了这么多的灵活性,但我不能看到自己需要它。我只想要能够选择标签的宽度,以及它是一个“硬”标签(使用标签字符)还是一个“软”标签(由空格组成)。在硬标签和软标签之间切换是很容易的(:set expandtab!),但我希望这是更直接的设置标签的宽度,而不必干扰3个不同的参数。
所以我提出的建议类似:set stab = 4仍然听起来不错。
" put all this in your .vimrc or a plugin file command! -nargs=* Stab call Stab() function! Stab() let l:tabstop = 1 * input('set shiftwidth=') if l:tabstop > 0 " do we want expandtab as well? let l:expandtab = confirm('set expandtab?',"&Yes\n&No\n&Cancel") if l:expandtab == 3 " abort? return endif let &l:sts = l:tabstop let &l:ts = l:tabstop let &l:sw = l:tabstop if l:expandtab == 1 setlocal expandtab else setlocal noexpandtab endif endif " show the selected options try echohl ModeMsg echon 'set tabstop=' echohl Question echon &l:ts echohl ModeMsg echon ' shiftwidth=' echohl Question echon &l:sw echohl ModeMsg echon ' sts=' echohl Question echon &l:sts . ' ' . (&l:et ? ' ' : 'no') echohl ModeMsg echon 'expandtab' finally echohl None endtry endfunction