Tab Vs Vim中的空间首选项
Vim在选项卡Vs.时非常适应。 空间偏好。 据我了解, tabstop
设置表示一个制表符的宽度。 shiftwidth
设置指定在使用<<和>>命令时增加/减less多less列,而softtabstop
设置影响在插入模式下按下Tab键时要插入的空白量。 如果展开选项卡打开,选项卡键插入softtabstop
空间字符数。 而在closuresexpandtab
下,按下Tab键将插入与softtabstop
匹配的最小可能数量的tab +空格字符。 (如果我错了,请纠正我)
这最后一点让我想知道:有没有实际的情况下,你不希望shiftwidth == tabstop && tabstop == softtabstop
? 我想不出一个。 就我而言,如果我能在一个单一的任务中将所有这三个值设定为相同的值,那将是最方便的。 例如打电话:
:set stab=4
这将相当于运行:
:set tabstop=4 softtabstop=4 shiftwidth=4
任何人都可以build议如何做到这一点?
UPDATE
感谢太多的PHP , hobbs和kaiser.se的答复 。 而不是单独回复每个人,我在这里更新这个问题。
closuresexpandtab的Softtabstop
我上面说过,在closuresexpandtab的情况下,按下Tab键插入与softtabstop
匹配的最小可能数量的tab +空格字符。 我坚持这一点,但我想我需要解释我的意思。 我将通过几个例子来尝试这样做。 要继续,请运行:set list
以便可以看到制表符。
tabstop=4 softtabstop=2 shiftwidth=4 noexpandtab
在插入模式下,按Tab键插入2个空格字符。 再次按Tab键,而不是插入两个空格字符(对于总共4个空格字符),它将使用单个制表符replace以前的两个空格。 Tabstop设置为4,因此单个制表符与4个空格具有相同的宽度。
tabstop=4 softtabstop=6 shiftwidth=4 noexpandtab
在插入模式下,按Tab键插入1个制表符加2个空格。 制表符的宽度是4,所以总宽度是6,这是用3个字符实现的。 再次按Tab键插入两个制表符,并删除以前插入的两个空格。 总宽度是12,这是用3个字符实现的。
在这两个例子中,Vim插入与softtabstop匹配的最小可能数量的tab +空格字符。
如果我正在closuresexpandtab,我看不到自己希望通过将softtabstop设置为与tabstop不同的值来实现额外的粒度控制。 对于我来说,使用单个命令可以将tabstop
, softtabstop
和shiftwidth
设置为相同的值仍然是有用的。
expandtab是否使softtabstop冗余?
tabstop=4 softtabstop=0 shiftwidth=4 expandtab
在插入模式下,按Tab键插入4个空格。 按删除键删除一个空格 – 所以你必须退格4次,如果你意外击中标签键。
tabstop=4 softtabstop=4 shiftwidth=4 expandtab
在插入模式下,按Tab键插入4个空格。 按退格键删除4个空格。
如果我正在处理expandtab
打开,我宁愿删除键删除相同数量的空格作为制表符插入。 所以在这种情况下,我也觉得可以同时赋予tabstop
, softtabstop
和shiftwidth
同样的值。
快捷方式仍然有用
Vim提供了如此多的灵活性,但是我看不到自己需要它。 我只是想能够select一个选项卡的宽度,是否是一个“硬”选项卡(使用制表符)或“软”选项卡(由空格组成)。 在硬标签和软标签之间切换是很容易的( :set expandtab!
),但是我希望更直接的设置标签的宽度,而不必使用3个不同的参数。
所以我提出的build议如下:set stab=4
仍然听起来不错。
在Vim中创build一个stab
选项并不是件容易的事情,但是我掀起了一个你可以放在.vimrc
命令/函数(或者是一个超级组织的插件文件)。 使用:Stab
,系统会提示您input缩进级别以及是否使用expandtab
。 如果您在不input新缩进级别的情况下回车,它只会打印当前的设置。
“把所有这些放在你的.vimrc或一个插件文件中 命令! -nargs = *刺戳Stab() function! 刺() 让l:tabstop = 1 * input('set shiftwidth =') 如果l:tabstop> 0 “我们是否也想要expandtab? 让l:expandtab =确认('set expandtab?',“&是\ n&否\ n&取消”) 如果l:expandtab == 3 “中止? 返回 万一 让&l:sts = l:tabstop 让&l:ts = 1:tabstop 让&l:sw = 1:tabstop 如果l:expandtab == 1 setlocal expandtab 其他 setlocal noexpandtab 万一 万一 “显示选定的选项 尝试 echohl ModeMsg echon'set tabstop =' echohl问题 echon&l:ts echohl ModeMsg echon'shiftwidth =' echohl问题 echon&l:sw echohl ModeMsg echon'sts =' echohl问题 echon&l:sts。 ''。 (&l:et?'':'no') echohl ModeMsg echon'expandtab' 最后 echohl无 ENDTRY endfunction这样
这是我写VimScript的第一次尝试,但是这里是:
function! Stab(value) let &shiftwidth = a:value let &softtabstop = a:value let &tabstop = a:value endfunc
如果我把它放在我的.vimrc文件中,我可以通过运行调用它:call Stab(X)
,其中X是所需的制表符宽度。 这是一个适当的解决scheme,但如果任何人都可以提出一个更容易打电话的方法,我将不胜感激。
我也创build了一个快速总结当前设置的函数,我已经映射到ctrl-Tab:
nmap <C-Tab> :call TabParams()<CR> function! TabParams() echo "tabstop: ".&tabstop echo "shiftwidth: ".&shiftwidth echo "softtabstop: ".&softtabstop endfunc
那么,我为这个答案提出了100点的奖励,现在我自己解决了一半。 不知道我是否可以接受我自己的答案…
无论tabstop
, softtabstop
或expandtab
设置如何,您都可以在编辑模式下使用Ctrl-T进行缩进,并使用Ctrl-D取消下一个由shiftwidth
设置的缩进级别。 Vim将自动添加/删除空格或制表符,以将您带到右侧的列。
如果使用这些命令来控制缩进而不是Tab / Backspace ,则不必担心所有这些标签设置合在一起,并始终达到正确的缩进级别。
如果expandtab
被设置,那么(因为太多的php指出), softtabstop
变得多余。 你可以设置与tabstop
不同的唯一的原因是为了迎合一个奇怪的习惯。 例如,您使用四个空格缩进,但更喜欢tab插入八个空格。
如果expandtab
没有设置,那么事情会变得模糊。 如果你想让你的代码和在vim中使用cat
和non-vim编辑器一样, tabstop
应该始终设置为8; 在这种情况下,您可以将softtabstop
和shiftwidth
都设置为您的首选缩进级别。 如果您更喜欢文件中的每个“物理选项卡”代表一个缩进级别,则可以将tabstop
和shiftwidth
设置为您的首选缩进级别并将softtabstop
设置为零(将其设置为等于tabstop
是等同的,只是如果更改了tabstop
不同步,而零意味着“请忽略这个”)。
你对softtabstop
和expandtab
理解是错误的,所以你build议的stab
选项不会很有用。
expandtab
用于当你想使用空格而不是制表符时的所有内容 。 如果设置了expandtab
,那么Vim将忽略softtabstop
选项,并使用tabstop
和shiftwidth
来计算要插入多less个空格。
softtabstop
仅适用于当您要使用多个制表符和空格组合时,允许您使用精细控制(2或4个空格)进行缩进,同时将制表符宽度保持在较高的值(通常为8),以便文本显示在另一个应用。 设置softtabstop=tabstop
不会完成任何事情,因为Vim总是使用制表符来缩进。
更新:正如kaizer.se指出的那样,如果你正在使用expandtab
,那么你仍然需要设置softtabstop
如果你想让Vim像多个标签一样退格多个空格。
你是否经常改变你的空白设置,你真的需要一个function来pipe理它? 如果你正在搞tabstop很多,并设置expandtab,你可能会随着时间的推移而变得乱七八糟,因为你改变了不同的值传递给stab
。 今天我用:call stab (4)
,明天是:call stab (2)
,上个星期是:call stab (8)
。 听起来就像你写的那样,你很快就会停止使用它。
如果你打算总是传递相同的价值刺,为什么不编辑你的全局设置? 在vim中:
:e $MYVIMRC
并添加以下内容:
set tabstop=4 set shiftwidth=4 "tabs are 4 spaces wide (default = 8) set expandtab "Convert tabs to spaces
这就是我的.vimrc设置。