Tab Vs Vim中的空间首选项

Vim在选项卡Vs.时非常适应。 空间偏好。 据我了解, tabstop设置表示制表符的宽度。 shiftwidth设置指定在使用<<和>>命令时增加/减少多少列,而softtabstop设置影响在插入模式下按下Tab键时要插入的空白量。 如果expandtab打开,则选项卡键将插入softtabstop空格字符数。 而在关闭expandtab下,按Tab键插入与softtabstop匹配的最小可能数量的制表符+空格字符。 (如果我错了,请纠正我。)

这最后一点让我想知道:有没有实际的情况下,你不希望shiftwidth == tabstop && tabstop == softtabstop ? 我想不出一个。 就我而言,如果我可以在一个任务中将所有这三个值设置为相同的值,那将是最方便的。 例如打电话:

:set stab=4

这将相当于运行:

:set tabstop=4 softtabstop=4 shiftwidth=4 

任何人都可以建议如何做到这一点?


UPDATE

感谢太多的PHP,hobbs和kaiser.se的答复。 而不是单独回复每个人,我在这里更新问题。

关闭expandtab的Softtabstop

我上面说过,在关闭expandtab的情况下,按下Tab键可以插入尽可能少的匹配softtabstop的tab +空格字符。 我坚持这一点,但我认为我需要解释我的意思。 我将通过几个例子尝试这样做。 要继续,请运行:set list以便您可以看到制表符。

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匹配的最小可能数量的tab +空格字符。

如果我正在关闭expandtab,我看不到自己希望通过将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打开,我宁愿使用删除键来删除与tab键插入相同数量的空白。 所以在这种情况下,我也觉得能够同时赋予tabstopsofttabstopshiftwidth同样的值会很有用。

快捷方式仍然有用

Vim提供了如此多的灵活性是很棒的,但我看不到自己需要它。 我只想选择一个标签的宽度,以及它是一个'硬'标签(使用制表符)还是'软'标签(由空格组成)。 在硬标签和软标签之间切换很容易( :set expandtab! ),但我希望更直接的设置标签的宽度,而不必使用3个不同的参数。

所以我提出的建议是:set stab=4对我来说仍然很好。


在Vim中创建一个stab选项并不容易,但是我已经提出了可以放在.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?', "&Yesn&Non&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分的奖励,现在我自己解决了一半。 不确定我是否可以接受我自己的答案...


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

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

链接地址: http://www.djcxy.com/p/28637.html

上一篇: Tab Vs Space preferences in Vim

下一篇: Convert tabs to spaces in Notepad++