Vim中的选项卡与空间首选项
Vim在选项卡和空间首选项方面非常灵活。据我所知,Vim中的选项卡与空间首选项,vim,whitespace,preferences,Vim,Whitespace,Preferences,Vim在选项卡和空间首选项方面非常灵活。据我所知,tabstop设置指示制表符的宽度。shiftwidth设置指定在使用命令时增加/减少多少列,而softtabstop设置影响在插入模式下按Tab键时插入的空白量。如果启用了expandtab,则tab键将插入softtabstop空格字符数。而在expandtab关闭的情况下,按Tab键可插入尽可能少的与softtabstop匹配的制表符+空格字符。(如果我错了,请纠正我。) 最后一点让我想知道:有没有一个实际的例子,你不希望shiftwidt
tabstop
设置指示制表符的宽度。shiftwidth
设置指定在使用命令时增加/减少多少列,而softtabstop
设置影响在插入模式下按Tab键时插入的空白量。如果启用了expandtab
,则tab键将插入softtabstop
空格字符数。而在expandtab
关闭的情况下,按Tab键可插入尽可能少的与softtabstop
匹配的制表符+空格字符。(如果我错了,请纠正我。)
最后一点让我想知道:有没有一个实际的例子,你不希望shiftwidth==tabstop&&tabstop==softtabstop
?我想不出一个。就我而言,如果我能在一次赋值中把这三个都设置为相同的值,那将是最方便的。e、 g.电话:
:set stab=4
这相当于运行:
:set tabstop=4 softtabstop=4 shiftwidth=4
有人能建议如何做到这一点吗
更新 感谢您的回复,php、hobbs和kaiser.se的回复太多了。我不是逐一回答,而是在这里更新问题。 关闭expandtab的Softtabstop 我在上面说过,在expandtab关闭的情况下,按Tab键插入尽可能少的Tab+空格字符,这些字符与
softtabstop
匹配。我支持这一点,但我想我需要解释一下我的意思。我将通过几个例子来尝试这样做。要继续操作,请运行:设置列表
,以便查看制表符
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个空格。按delete键删除单个空格-因此,如果您意外地按tab键,则必须退格4次
tabstop=4 softtabstop=4 shiftwidth=4 expandtab
在插入模式下,按tab键可插入4个空格。按backspace键删除4个空格
如果我在打开expandtab
的情况下工作,我希望delete键删除与tab键插入相同数量的空白。因此,在这种情况下,我也觉得能够同时为tabstop
、softtabstop
和shiftwidth
分配相同的值会很有用
捷径仍然有用
Vim提供了如此多的灵活性,这很好,但我看不出自己需要它。我只想能够选择选项卡的宽度,以及它是“硬”选项卡(使用制表符)还是“软”选项卡(由空格组成)。在硬标签和软标签之间切换非常简单(:set expandtab!
),但我希望设置标签宽度更简单,而不必处理3个不同的参数
因此,我建议的类似于
:set stab=4
的建议对我来说仍然很好。您对softtabstop
和expandtab
的理解是错误的-因此您建议的stab
选项没有多大用处
expandtab
适用于您希望使用空格而不是制表符处理所有内容的情况。如果设置expandtab
,则Vim将忽略softtabstop
选项,并使用tabstop
和shiftwidth
计算要插入的空格数
softtabstop
仅适用于希望混合使用制表符和空格的情况,允许精细控制缩进(2或4个空格),同时将制表符宽度保持在较高的值(通常为8),以便文本显示在其他应用程序中。设置softtabstop=tabstop
没有任何作用,因为Vim总是使用制表符进行缩进
更新:如前所述,如果您使用的是
expandtab
,那么您仍然需要设置softtabstop
,如果希望Vim将多个空格退格,就像它们是一个选项卡一样。如果设置了expandtab
,那么softtabstop
将变得多余。您设置shiftwidth
与tabstop
不同的唯一原因是为了迎合一个奇怪的习惯;例如,您使用了四个空格缩进,但您更喜欢tab插入八个空格
如果
expandtab
未设置,则情况会变得更加模糊。如果您希望您的代码在使用cat时看起来相同
function! Stab(value)
let &shiftwidth = a:value
let &softtabstop = a:value
let &tabstop = a:value
endfunc
nmap <C-Tab> :call TabParams()<CR>
function! TabParams()
echo "tabstop: ".&tabstop
echo "shiftwidth: ".&shiftwidth
echo "softtabstop: ".&softtabstop
endfunc
:e $MYVIMRC
set tabstop=4
set shiftwidth=4 "tabs are 4 spaces wide (default = 8)
set expandtab "Convert tabs to spaces
" 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