Vim非常适应标签Vs.空间偏好。据我了解,tabstop
设置表示制表符的宽度。 shiftwidth
设置指定在使用<< 和>> 命令时递增/递减的列数,而softtabstop
在插入模式下按 Tab 键时,设置会影响要插入的空白量。如果启用expandtab
,则Tab键会插入softtabstop
个空格字符。在关闭expandtab
的情况下,按 Tab 键会插入与softtabstop
匹配的尽可能少的制表符+空格字符。 (如果我错了,请纠正我。)
最后一点让我想知道:是否有一个你不想要shiftwidth == tabstop && tabstop == softtabstop
的实际案例?我想不出一个。就我而言,如果我可以在一个单独的任务中将所有这三个设置为相同的值,那将是最方便的。例如主叫:
:set stab=4
这相当于运行:
:set tabstop=4 softtabstop=4 shiftwidth=4
有人可以建议如何做到这一点吗?
感谢目前为止太多php , hobbs 和 kaiser.se 的回复。我不是单独回复每个人,而是在这里更新问题。
我在上面说过,关闭expandtab后,按Tab键会插入尽可能少的与softtabstop
匹配的制表符+空格字符。我支持这一点,但我认为我需要解释我的意思。我将通过几个例子尝试这样做。要继续,请运行:set list
,以便您可以看到制表符。
tabstop=4 softtabstop=2 shiftwidth=4 noexpandtab
在插入模式下,按Tab键可插入2个空格字符。再次按Tab键,而不是再插入两个空格字符(总共4个空格字符),它将使用单个制表符替换前两个空格。 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
设置为相同的值对我来说仍然有用。
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
之类的建议仍然听起来不错。
答案 0 :(得分:55)
在Vim中创建一个stab
选项本身并不容易,但是我已经掀起了这个命令/函数,你可以放入.vimrc
(如果你是超级的话,可以插入一个插件文件) -organized)。使用:Stab
,系统会提示您输入缩进级别以及是否使用expandtab
。如果按Enter键而不给它一个新的缩进级别,它将只打印当前设置。
" 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
答案 1 :(得分:9)
这是我第一次尝试编写VimScript,但这里是:
function! Stab(value)
let &shiftwidth = a:value
let &softtabstop = a:value
let &tabstop = a:value
endfunc
如果我把它放在我的.vimrc文件中,我可以通过运行:call Stab(X)
来调用它,其中X是所需的标签宽度。现在这是一个适当的解决方案,但如果有人能提出一种让我更容易打电话的方式,我将不胜感激。
我还创建了一个快速总结当前设置的函数,我已将其映射到ctrl-Tab:
nmap <C-Tab> :call TabParams()<CR>
function! TabParams()
echo "tabstop: ".&tabstop
echo "shiftwidth: ".&shiftwidth
echo "softtabstop: ".&softtabstop
endfunc
嗯,我为这个答案提出了100分的赏金,现在我自己已经解决了一半。不确定我是否可以接受我自己的答案......
答案 2 :(得分:7)
您可以在编辑模式下使用 Ctrl-T 缩进和 Ctrl-D 以取消shiftwidth
设置的下一个缩进级别,无论如何tabstop
,softtabstop
或expandtab
设置。 Vim会自动添加/删除空格或制表符,以便您进入正确的列。
如果您使用这些命令来控制缩进而不是 Tab / Backspace ,您不必担心所有这些选项卡设置适合在一起并始终正确缩进级别。
答案 3 :(得分:3)
如果设置了expandtab
,那么(因为过多的php指出),softtabstop
变得多余。您shiftwidth
与tabstop
不同的唯一原因是为了迎合奇怪的习惯;例如,你使用四个空格的缩进,但你更喜欢 tab 来插入八个空格。
如果expandtab
未设置,则事情变得模糊不清。如果您希望代码在cat
和非vim编辑器中与vim中的代码相同,那么tabstop
应始终设置为8;在这种情况下,您可以将softtabstop
和shiftwidth
都设置为首选缩进级别。如果您更喜欢文件中的每个“物理标签”代表一个缩进级别,您可以将tabstop
和shiftwidth
设置为首选缩进级别,并将softtabstop
保留为零(将其设置为相等)到tabstop
是相同的,除非你改变tabstop
它会失去同步,而零只是意味着“请忽略它”。)
答案 4 :(得分:2)
您对softtabstop
和expandtab
的理解是错误的 - 因此您建议的stab
选项不会非常有用。
expandtab
适用于您希望使用空格而非所有内容的标签。如果您设置expandtab
,则Vim会忽略softtabstop
选项,并使用tabstop
和shiftwidth
计算要插入的空格数。
softtabstop
仅适用于您希望使用 mix 标签和空格的情况,允许您通过精确控制进行缩进(2或4个空格) ),同时将标签宽度保持在较高的值(通常为8),以便文本出现在其他应用程序中。设置softtabstop=tabstop
无法完成任何事情,因为Vim将始终使用制表符进行缩进。
更新:正如kaizer.se指出的那样,如果您使用的是expandtab
,那么如果您希望Vim退格多个,则仍需要设置softtabstop
空格好像它们是一个标签。
答案 5 :(得分:2)
您是否经常更改空白区域设置以确实需要一个功能来管理它?如果你经常搞乱tabstop并设置expandtab,那么当你更改传递给stab
的不同值的文件时,你可能会随着时间的推移而变得一团糟。今天我使用:call stab (4)
,明天是:call stab (2)
,上周是:call stab (8)
。听起来即使你写它,你很快就会停止使用它。
如果您打算始终将相同的值传递给stab,为什么不编辑全局设置?在vim:
:e $MYVIMRC
并添加以下内容:
set tabstop=4
set shiftwidth=4 "tabs are 4 spaces wide (default = 8)
set expandtab "Convert tabs to spaces
这就是我的.vimrc设置方式。
答案 6 :(得分:1)
一个有用的选项是softtabstop=-1
,它会将其设置为shiftwidth
的值。
您还可以将shiftwidth
设置为0,在这种情况下,将使用tabstop
值。