在Vim的标签Vs的空间偏好(Tab Vs Space preferences in Vim)

2019-07-23 08:40发布

当涉及到标签比。Vim颇容纳 空间的偏好。 据我所知,所述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 

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


UPDATE

感谢这么远太多PHP, 霍布斯kaiser.se的答复。 而不是单独回复每一个,我在这里更新的问题。

Softtabstop与expandtab关闭

我说上面,与expandtab关闭时,按下Tab键插入的匹配Tab +空格字符的最小可能数softtabstop 。 我支持这个,但我想我需要解释一下我的意思。 我将试图通过一些实例的方式这样做。 沿着沿,运行:set list ,这样就可以看到制表符。

tabstop=4 softtabstop=2 shiftwidth=4 noexpandtab

在插入模式中,按下tab键刀片2个空格字符。 按tab键的第二时间,并且代替插入2个更多的空间字符(总共4个空格字符)它替换先前的2位具有单个制表符。 制表位被设置为4,所以单个制表符具有相同的宽度,4个空格。

tabstop=4 softtabstop=6 shiftwidth=4 noexpandtab

在插入模式中,按下tab键插入物1个制表符加2位。 制表符具有为4的宽度,所以总宽度为6,这是使用3个字符来实现的。 按下tab键的第二时间插入两个制表符,并删除先前插入两个空间。 总宽度为12,并且这是使用3个字符来实现的。

在这两个例子中,Vim插入的的Tab +空格字符的最小可能数目相匹配softtabstop。

如果我有expandtab工作关掉,我看不到自己想要的是可以通过设置softtabstop从制表位不同的值来实现额外的细粒度控制。 它仍然将是有益的我能够设置tabstopsofttabstopshiftwidth相同的值用一个命令。

是否expandtab使softtabstop多余?

tabstop=4 softtabstop=0 shiftwidth=4 expandtab

在插入模式中,按下tab键插入物4米的空间。 按Delete键删除一个单一的空间 - 让你不得不退格键4次,如果你击中意外TAB键。

tabstop=4 softtabstop=4 shiftwidth=4 expandtab

在插入模式中,按下tab键插入物4米的空间。 按退格键删除4个空格。

如果我有工作expandtab接通,我宁愿删除键删除空白的相同数量的tab键插入。 所以在这种情况下,我也觉得这将是能够分配相同的值,有效tabstopsofttabstopshiftwidth同时。

快捷方式仍然是有用的

这是伟大的Vim提供这么多的灵活性,但我看不到自己需要它。 我只是希望能够选择一个选项卡的宽度,以及它是否是一个“硬”选项卡(使用制表符)或“软”选项卡(由空格)。 软硬标签之间的切换是很容易的( :set expandtab!但我想这是更简单的设置选项卡的宽度,而不必与3个不同的参数来摆弄。

所以我的建议建议这样的事情:set stab=4听起来仍然对我好。

Answer 1:

创建一个stab在Vim的自身选择并不容易,但我已经刮起了此命令/功能,你可以在你的下降.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


Answer 2:

这是我在写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点赏金这个答案,现在我已经解决了一半它自己。 不知道如果我能接受我自己的答案...



Answer 3:

您可以在编辑模式下也可以使用Ctrl-T缩进和通过设置按Ctrl-d来deindent到下一个缩进级别shiftwidth ,无论tabstopsofttabstopexpandtab设置。 Vim会自动添加/删除空格或制表符给您带来右侧立柱。

如果使用这些命令来控制缩进而不是 / 退格 ,你不必担心所有装配在一起,这些选项卡设置,并始终得到正确的缩进级别。



Answer 4:

如果expandtab设置,那么(如过多的PHP指出), softtabstop变得多余。 您可以设置的唯一原因shiftwidth从不同tabstop将满足一个奇怪的习惯; 例如,你用四个空格缩进,但是你喜欢选项卡插入八个空格。

如果expandtab未设置然后事情就变得模糊。 如果你希望你的代码看起来相同与cat和非vim的编辑,因为它在vim的话,那么tabstop应始终在8设置; 在这种情况下,你会设置softtabstopshiftwidth两到你喜欢的缩进水平。 如果你而喜欢该文件中的每个“物理选项卡”代表一个缩进级别,您将设置tabstopshiftwidth你喜欢的缩进水平,并留下softtabstop为零(设定为等于tabstop ,除了等同,如果更改tabstop它会不同步的,而零仅仅意味着“忽略此请”)。



Answer 5:

你的理解softtabstopexpandtab是错误的-这样的stab你的建议方案不会是非常有用的。

expandtab是当你想用空格代替标签的一切 。 如果设置expandtab ,那么Vim忽略softtabstop选项,并使用tabstopshiftwidth工作有多少空间插入。

softtabstop仅用于当要使用制表和空格的混合 ,让您与精细控制(2个或4个空格)缩进,而在较高的值(通常为8),保持片宽度,以使文本显示在其他应用。 设置softtabstop=tabstop因为Vim总是使用标签来缩进不一事无成。

更新:由于kaizer.se已经指出的那样,如果你正在使用expandtab ,那么你仍然需要设置softtabstop如果你想Vim退格多个空格,就好像他们是一个标签。



Answer 6:

你改变你的白色空间设置,所以往往你真的需要一个功能来管理? 如果您正在使用的制表位很多搞乱,也设置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如何设置。



Answer 7:

一种有用的选择是softtabstop=-1 ,这将其设置为的值shiftwidth
您还可以设置shiftwidth为0,在这种情况下, tabstop数值将被使用。



文章来源: Tab Vs Space preferences in Vim