Vim非常适应标签Vs.空间偏好。据我了解,tabstop设置表示制表符的宽度。 shiftwidth设置指定使用 <> 命令时要递增/递减的列数,而softtabstop设置会影响在插入模式下按Tab键时要插入的空白量。如果expandtab打开,则Tab键会插入softtabstop个空格字符。在关闭expandtab的情况下,按Tab键会插入与softtabstop匹配的最小可能数量的制表符+空格字符。 (如果我错了,请纠正我。)
最后一点让我想知道:是否有一个你不想要shiftwidth == tabstop && tabstop == softtabstop的实际案例?我想不出一个。就我而言,如果我可以在一个单独的任务中将所有这三个设置为相同的值,那将是最方便的。例如电话:
这相当于运行:
1
| :set tabstop=4 softtabstop=4 shiftwidth=4 |
任何人都可以建议如何做到这一点?
UPDATE
感谢迄今为止对php,hobbs和kaiser.se的回复。我不是单独回复每个人,而是在这里更新问题。
Softtabstop已关闭expandtab
我在上面说过,关闭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设置为相同的值对我来说仍然有用。
expandtab是否使softtabstop冗余?
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这样的建议对我来说听起来还不错。
-
看起来好像你有两个不同的问题,也许你应该将你的问题分成两部分。
-
你是对的! 我已经将第二个问题转移到了自己的主题中。
-
这似乎是一个RFE而不是一个问题。 因此,您可能应该向VIM社区提出建议:vim.org/community.php - 或者只是编写一个补丁。 除此之外,VIM还有一个广泛的宏工具,允许您定义新操作,因此您很可能只需创建一个可以满足您需要的宏。
-
@nelstrom关于你的问题is there a practical case where you wouldn't want shiftwidth == tabstop && tabstop == softtabstop?,Vim自己的源代码使用set shiftwidth=4 tabstop=8 noexpandtab。 是的,人们通常想要shiftwidth == softtabstop,但这与tabstop的值无关。
在Vim中创建一个stab选项本身并不容易,但是我已经掀起了这个命令/函数,你可以放入.vimrc(如果你是超级组织的话,还可以插入一个插件文件)。使用:Stab,系统将提示您输入缩进级别以及是否使用expandtab。如果按Enter键而不给它一个新的缩进级别,它将只打印当前设置。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| " 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
&No
&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 |
-
谢谢你的剧本!它比我要求的更多 - 我想我更愿意保持expandtab - 但我可以轻松地根据自己的喜好自定义它。你在Vimscript中为我提供了一个小型速成课程,所以我非常感激。 100分赏金是你的!
这是我第一次尝试编写VimScript,但是这里是:
1 2 3 4 5
| function! Stab(value)
let &shiftwidth = a:value
let &softtabstop = a:value
let &tabstop = a:value
endfunc |
如果我把它放在我的.vimrc文件中,我可以通过运行:call Stab(X)来调用它,其中X是所需的标签宽度。这对于现在来说是一个充分的解决方案,但是如果有人能提出一种让我更容易打电话的方式,我将不胜感激。
我还创建了一个快速汇总当前设置的函数,我已将其映射到ctrl-Tab:
1 2 3 4 5 6
| nmap <C-Tab> :call TabParams()<CR>
function! TabParams()
echo"tabstop: ".&tabstop
echo"shiftwidth: ".&shiftwidth
echo"softtabstop:".&softtabstop
endfunc |
好吧,我为这个答案提出了100分的赏金,现在我已经自己解决了一半。不确定我是否可以接受我自己的答案......
-
+1是的,但如果这是你真正想要的,它仍然是一个好的答案。
-
您可能希望使用let&amp; l:shiftwidth等来设置本地版本。
您可以在编辑模式下使用Ctrl-T进行缩进,并使用Ctrl-D对shiftwidth设置的下一个缩进级别进行取消,而不管tabstop,softtabstop或expandtab设置如何。 Vim会自动添加/删除空格或制表符,以便您进入正确的列。
如果您使用这些命令来控制缩进而不是Tab / Backspace,则不必担心所有这些选项卡设置适合在一起并始终达到正确的缩进级别。
如果设置expandtab(因为太多的PHP指出),softtabstop变得多余。你可以设置shiftwidth与tabstop不同的唯一原因是为了迎合一个奇怪的习惯;例如,你使用四个空格缩进,但你更喜欢tab插入八个空格。
如果expandtab未设置,那么事情会变得更加模糊。如果您希望代码在cat和非vim编辑器中看起来与在vim中一样,那么tabstop应始终设置为8;在这种情况下,您可以将softtabstop和shiftwidth都设置为首选缩进级别。如果您更喜欢文件中的每个"物理选项卡"代表一个缩进级别,您可以将tabstop和shiftwidth设置为首选缩进级别,并将softtabstop设置为零(将其设置为等于tabstop等效)除了如果你改变tabstop它会失去同步,而零只是意味着"请忽略这个"。
-
我认为这是错误的,因为只有将softtabstop设置为正确的值,才会退格删除一个间隔缩进,就像它是一个制表符一样。这是必须的合理使用。
您是否经常更改空白区域设置以确实需要一个功能来管理它?如果你经常搞乱tabstop并设置expandtab,那么当你更改传递给stab的不同值的文件时,你可能会随着时间的推移而变得一团糟。今天我使用:call stab (4),明天是:call stab (2),上周它是:call stab (8)。听起来即使你写它,你很快就会停止使用它。
如果您打算始终将相同的值传递给stab,为什么不编辑全局设置?在vim中:
并添加以下内容:
1 2 3
| set tabstop=4
set shiftwidth=4 "tabs are 4 spaces wide (default = 8)
set expandtab "Convert tabs to spaces |
这就是我的.vimrc的设置方式。
您对softtabstop和expandtab的理解是错误的 - 因此您建议的stab选项不会非常有用。
expandtab适用于您想要为所有内容使用空格而不是制表符的情况。如果设置expandtab,则Vim忽略softtabstop选项并使用tabstop和shiftwidth计算要插入的空格数。
softtabstop仅适用于您希望混合使用制表符和空格的情况,允许您使用精细控制(2或4个空格)缩进,同时将制表符宽度保持在较高值(通常为8),以便文本显示在其他应用程序。设置softtabstop=tabstop没有完成任何事情,因为Vim将始终使用制表符进行缩进。
更新:正如kaizer.se指出的那样,如果您使用的是expandtab,那么如果您希望Vim将多个空格退格,就像它们是一个标签一样,您仍然需要设置softtabstop。
-
虽然你设置extpandtab时tabstop和softtabstop变成一个变量太多了,但我认为你的优先级错了。试试吧:设置ts=8 sts=4 et并按Tab键;光标将在第五列,并且将插入四个空格,就像您已设置ts=4 sts=0 et一样。
-
我认为这是错误的,因为只有将softtabstop设置为正确的值,才会退格删除一个间隔缩进,就像它是一个制表符一样。这是必须的合理使用。
-
@ kaizer.se:谢谢你的纠正
一个有用的选项是softtabstop=-1,它将其设置为shiftwidth的值。
您还可以将shiftwidth设置为0,在这种情况下将使用tabstop值。