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

感谢太多的PHPhobbskaiser.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不同的值来实现额外的粒度控制。 对于我来说,使用单个命令可以将tabstopsofttabstopshiftwidth设置为相同的值仍然是有用的。

expandtab是否使softtabstop冗余?

tabstop=4 softtabstop=0 shiftwidth=4 expandtab

在插入模式下,按Tab键插入4个空格。 按删除键删除一个空格 – 所以你必须退格4次,如果你意外击中标签键。

tabstop=4 softtabstop=4 shiftwidth=4 expandtab

在插入模式下,按Tab键插入4个空格。 按退格键删除4个空格。

如果我正在处理expandtab打开,我宁愿删除键删除相同数量的空格作为制表符插入。 所以在这种情况下,我也觉得可以同时赋予tabstopsofttabstopshiftwidth同样的值。

快捷方式仍然有用

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点的奖励,现在我自己解决了一半。 不知道我是否可以接受我自己的答案…

无论tabstopsofttabstopexpandtab设置如何,您都可以在编辑模式下使用Ctrl-T进行缩进,并使用Ctrl-D取消下一个由shiftwidth设置的缩进级别。 Vim将自动添加/删除空格或制表符,以将您带到右侧的列。

如果使用这些命令来控制缩进而不是Tab / Backspace ,则不必担心所有这些标签设置合在一起,并始终达到正确的缩进级别。

如果expandtab被设置,那么(因为太多的php指出), softtabstop变得多余。 你可以设置与tabstop不同的唯一的原因是为了迎合一个奇怪的习惯。 例如,您使用四个空格缩进,但更喜欢tab插入八个空格。

如果expandtab没有设置,那么事情会变得模糊。 如果你想让你的代码和在vim中使用cat和non-vim编辑器一样, tabstop应该始终设置为8; 在这种情况下,您可以将softtabstopshiftwidth都设置为您的首选缩进级别。 如果您更喜欢文件中的每个“物理选项卡”代表一个缩进级别,则可以将tabstopshiftwidth设置为您的首选缩进级别并将softtabstop设置为零(将其设置为等于tabstop是等同的,只是如果更改了tabstop不同步,而零意味着“请忽略这个”)。

你对softtabstopexpandtab理解是错误的,所以你build议的stab选项不会很有用。

expandtab用于当你想使用空格而不是制表符时的所有内容 。 如果设置了expandtab ,那么Vim将忽略softtabstop选项,并使用tabstopshiftwidth来计算要插入多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设置。