Tab Vs Vim中的空间首选项

时间:2009-10-13 19:15:29

标签: vim whitespace preferences

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的Softtabstop

我在上面说过,关闭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不同的值来实现额外的粒度控制。使用单个命令将tabstopsofttabstopshiftwidth设置为相同的值对我来说仍然有用。

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键插入相同数量的空格。所以在这种情况下,我觉得能够同时为tabstopsofttabstopshiftwidth分配相同的值会很有用。

快捷方式仍然有用

Vim提供了如此大的灵活性,这很棒,但我看不出自己需要它。我只是想能够选择标签的宽度,以及它是“硬”标签(使用标签字符)还是“软”标签(由空格组成)。在硬标签和软标签之间切换很容易(:set expandtab!),但我希望设置标签的宽度更简单,而不必使用3个不同的参数。

所以我对:set stab=4之类的建议仍然听起来不错。

7 个答案:

答案 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设置的下一个缩进级别,无论如何tabstopsofttabstopexpandtab设置。 Vim会自动添加/删除空格或制表符,以便您进入正确的列。

如果您使用这些命令来控制缩进而不是 Tab / Backspace ,您不必担心所有这些选项卡设置适合在一起并始终正确缩进级别。

答案 3 :(得分:3)

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

如果expandtab未设置,则事情变得模糊不清。如果您希望代码在cat和非vim编辑器中与vim中的代码相同,那么tabstop应始终设置为8;在这种情况下,您可以将softtabstopshiftwidth都设置为首选缩进级别。如果您更喜欢文件中的每个“物理标签”代表一个缩进级别,您可以将tabstopshiftwidth设置为首选缩进级别,并将softtabstop保留为零(将其设置为相等)到tabstop是相同的,除非你改变tabstop它会失去同步,而零只是意味着“请忽略它”。)

答案 4 :(得分:2)

您对softtabstopexpandtab的理解是错误的 - 因此您建议的stab选项不会非常有用。

expandtab 适用于您希望使用空格而非所有内容的标签。如果您设置expandtab,则Vim会忽略softtabstop选项,并使用tabstopshiftwidth计算要插入的空格数。

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值。