Vim中的Tab VS空间首选项

Vim是非常宽松的,当谈到标签Vs.空间偏好。根据我的理解,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

任何人都可以建议如何这样做?

更新

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

带有expandtab的Softtabstop已关闭

我上面说,expandtab关闭,按Tab键插入与softtabstop匹配的最小可能数量的制表空格字符。我坚持,但我认为我需要解释我的意思。我将通过几个例子尝试这样做。要继续,请运行: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匹配的最小可能数量的制表符空格字符。

如果我使用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仍然听起来不错。

在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?',"&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

相关文章

解决方案:解决linux下vim乱码的情况:(修改vimrc的内容)全...
Linuxvi/vim所有的UnixLike系统都会内建vi文书编辑器,其他的...
      vim正则匹配:空行:/^$/  /^[\t]*$/注释...
$select-editorSelectaneditor.Tochangelater,run'sele...
上次手贱忘了保存,这次就简单做个备忘吧,把踩过的坑记一下...
Linux之文本编译器小结vim的优势所有的UNIX-LIKE习通都会内置...