当涉及到标签比。Vim颇容纳 空间的偏好。 据我所知,所述tabstop
设置指示制表符的宽度。 该shiftwidth
设置指定使用<<和>>命令时多列如何递增/递减,而softtabstop
设置会影响当你按在插入模式Tab键将插入空格的数量。 如果expandtab
是,TAB键插入softtabstop
数量的空格字符。 而用expandtab
关闭时,按下Tab键插入一个可能的最小数目的选项卡+空格字符匹配softtabstop
。 (如果我错了,请大家指正。)
这最后一点让我想:有没有,你不希望一个实际案例shiftwidth == tabstop && tabstop == softtabstop
? 我想不出之一。 就我而言,这将是最方便的,如果我能的所有这些3设置为相同的值,在一个单一的分配。 如呼叫:
:set stab=4
这将等同于运行:
:set tabstop=4 softtabstop=4 shiftwidth=4
任何人都可以建议如何可以这样做?
UPDATE
感谢这么远太多PHP, 霍布斯和kaiser.se的答复。 而不是单独回复每一个,我在这里更新的问题。
Softtabstop与expandtab关闭
我说上面,与expandtab关闭时,按下Tab键插入的匹配Tab +空格字符的最小可能数softtabstop
。 我支持这个,但我想我需要解释一下我的意思。 我将试图通过一些实例的方式这样做。 沿着沿,运行:set list
,这样就可以看到制表符。
tabstop=4 softtabstop=2 shiftwidth=4 noexpandtab
在插入模式中,按下tab键刀片2个空格字符。 按tab键的第二时间,并且代替插入2个更多的空间字符(总共4个空格字符)它替换先前的2位具有单个制表符。 制表位被设置为4,所以单个制表符具有相同的宽度,4个空格。
tabstop=4 softtabstop=6 shiftwidth=4 noexpandtab
在插入模式中,按下tab键插入物1个制表符加2位。 制表符具有为4的宽度,所以总宽度为6,这是使用3个字符来实现的。 按下tab键的第二时间插入两个制表符,并删除先前插入两个空间。 总宽度为12,并且这是使用3个字符来实现的。
在这两个例子中,Vim插入的的Tab +空格字符的最小可能数目相匹配softtabstop。
如果我有expandtab工作关掉,我看不到自己想要的是可以通过设置softtabstop从制表位不同的值来实现额外的细粒度控制。 它仍然将是有益的我能够设置tabstop
, softtabstop
和shiftwidth
相同的值用一个命令。
是否expandtab使softtabstop多余?
tabstop=4 softtabstop=0 shiftwidth=4 expandtab
在插入模式中,按下tab键插入物4米的空间。 按Delete键删除一个单一的空间 - 让你不得不退格键4次,如果你击中意外TAB键。
tabstop=4 softtabstop=4 shiftwidth=4 expandtab
在插入模式中,按下tab键插入物4米的空间。 按退格键删除4个空格。
如果我有工作expandtab
接通,我宁愿删除键删除空白的相同数量的tab键插入。 所以在这种情况下,我也觉得这将是能够分配相同的值,有效tabstop
, softtabstop
和shiftwidth
同时。
快捷方式仍然是有用的
这是伟大的Vim提供这么多的灵活性,但我看不到自己需要它。 我只是希望能够选择一个选项卡的宽度,以及它是否是一个“硬”选项卡(使用制表符)或“软”选项卡(由空格)。 软硬标签之间的切换是很容易的( :set expandtab!
但我想这是更简单的设置选项卡的宽度,而不必与3个不同的参数来摆弄。
所以我的建议建议这样的事情:set stab=4
听起来仍然对我好。
创建一个stab
在Vim的自身选择并不容易,但我已经刮起了此命令/功能,你可以在你的下降.vimrc
(或插件文件,如果你是超级组织)。 用途:Stab
,你会被提示输入一个缩进级别,以及是否使用expandtab
。 如果碰到没有给它一个新的缩进层次输入,它只会打印出当前设置。
" 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
这是我在写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点赏金这个答案,现在我已经解决了一半它自己。 不知道如果我能接受我自己的答案...
您可以在编辑模式下也可以使用Ctrl-T缩进和通过设置按Ctrl-d来deindent到下一个缩进级别shiftwidth
,无论tabstop
, softtabstop
或expandtab
设置。 Vim会自动添加/删除空格或制表符给您带来右侧立柱。
如果使用这些命令来控制缩进而不是表 / 退格 ,你不必担心所有装配在一起,这些选项卡设置,并始终得到正确的缩进级别。
如果expandtab
设置,那么(如过多的PHP指出), softtabstop
变得多余。 您可以设置的唯一原因shiftwidth
从不同tabstop
将满足一个奇怪的习惯; 例如,你用四个空格缩进,但是你喜欢选项卡插入八个空格。
如果expandtab
未设置然后事情就变得模糊。 如果你希望你的代码看起来相同与cat
和非vim的编辑,因为它在vim的话,那么tabstop
应始终在8设置; 在这种情况下,你会设置softtabstop
和shiftwidth
两到你喜欢的缩进水平。 如果你而喜欢该文件中的每个“物理选项卡”代表一个缩进级别,您将设置tabstop
和shiftwidth
你喜欢的缩进水平,并留下softtabstop
为零(设定为等于tabstop
,除了等同,如果更改tabstop
它会不同步的,而零仅仅意味着“忽略此请”)。
你的理解softtabstop
和expandtab
是错误的-这样的stab
你的建议方案不会是非常有用的。
expandtab
是当你想用空格代替标签的一切 。 如果设置expandtab
,那么Vim忽略softtabstop
选项,并使用tabstop
和shiftwidth
工作有多少空间插入。
softtabstop
仅用于当要使用制表和空格的混合 ,让您与精细控制(2个或4个空格)缩进,而在较高的值(通常为8),保持片宽度,以使文本显示在其他应用。 设置softtabstop=tabstop
因为Vim总是使用标签来缩进不一事无成。
更新:由于kaizer.se已经指出的那样,如果你正在使用expandtab
,那么你仍然需要设置softtabstop
如果你想Vim退格多个空格,就好像他们是一个标签。
你改变你的白色空间设置,所以往往你真的需要一个功能来管理? 如果您正在使用的制表位很多搞乱,也设置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如何设置。
一种有用的选择是softtabstop=-1
,这将其设置为的值shiftwidth
。
您还可以设置shiftwidth
为0,在这种情况下, tabstop
数值将被使用。