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设置。