88

Vim 对 tab Vs 非常友好。空间偏好。据我了解,该tabstop设置表示制表符的宽度。该设置指定使用and命令shiftwidth时要增加/减少多少列,而该设置会影响在插入模式下按下键时要插入的空白量。如果打开,Tab 键插入空格字符数。而在关闭的情况下,按下该键会插入与 . 匹配的尽可能少的制表符+空格字符。(如果我错了,请纠正我。)<<>>softtabstopTabexpandtabsofttabstopexpandtabTabsofttabstop

最后一点让我想知道:是否存在您不想要的实际案例shiftwidth == tabstop && tabstop == softtabstop?我想不出一个。就我而言,如果我可以在一次分配中将所有这 3 个设置为相同的值,那将是最方便的。例如调用:

:set stab=4

这相当于运行:

:set tabstop=4 softtabstop=4 shiftwidth=4 

谁能建议如何做到这一点?


更新

感谢您迄今为止从太多的 phphobbskaiser.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

在插入模式下,按制表键插入 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 个空格。按 delete 键会删除一个空格 - 所以如果你不小心按了 tab 键,你必须退格 4 次。

tabstop=4 softtabstop=4 shiftwidth=4 expandtab

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

如果我在expandtab打开状态下工作,我希望删除键删除与 tab 键插入相同数量的空格。tabstop因此,在这种情况下,我也觉得能够同时为softtabstop和分配相同的值会很有用shiftwidth

捷径仍然有用

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

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

4

7 回答 7

57

在 Vim 本身中创建一个stab选项并不容易,但我已经创建了这个命令/函数,你可以放入你的.vimrc(或者如果你是超级组织的插件文件)。使用:Stab,系统将提示您输入缩进级别以及是否使用expandtab. 如果你在没有给它一个新的缩进级别的情况下按回车,它只会打印当前设置。

" 将所有这些放在你的 .vimrc 或插件文件中
命令!-nargs=* 刺调用刺()
功能!刺()
  让 l:tabstop = 1 * input('set shiftwidth=')

  如果 l:tabstop > 0
    “我们也想要 expandtab 吗?
    let l:expandtab = confirm('设置 expandtab?', "&Yes\n&No\n&Cancel")
    如果 l:expandtab == 3
      “中止?
      返回
    万一

    让 &l:sts = l:tabstop
    让 &l:ts = l:tabstop
    让 &l:sw = l:tabstop

    如果 l:expandtab == 1
      设置本地扩展选项卡
    别的
      设置本地 noexpandtab
    万一
  万一

  " 显示选择的选项
  尝试
    echohl ModeMsg
    echon '设置制表符 ='
    回声问题
    回声 &l:ts
    echohl ModeMsg
    回声'shiftwidth ='
    回声问题
    回声 &l:sw
    echohl ModeMsg
    回声'sts ='
    回声问题
    回声 &l:sts 。' ' 。(&l:et ? ' ' : '否')
    echohl ModeMsg
    回声'expandtab'
  最后
    回声无
  终试
结束功能
于 2009-10-23T00:09:03.433 回答
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 分的赏金,现在我自己解决了一半。不知道我是否可以接受我自己的答案...

于 2009-10-20T19:44:24.887 回答
7

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

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

于 2009-10-22T19:15:02.117 回答
3

如果expandtab设置然后(正如太多的 php 指出的那样),softtabstop就变得多余了。您设置shiftwidth不同的唯一原因tabstop是迎合一个奇怪的习惯;例如,您使用四个空格的缩进,但您更喜欢tab插入八个空格。

如果expandtab未设置,那么事情会变得更加模糊。如果您希望您的代码在使用cat和非 vim 编辑器中看起来与在 vim 中相同,tabstop则应始终设置为 8;在这种情况下,您可以将softtabstopand shiftwidthboth 设置为您喜欢的缩进级别。如果您希望文件中的每个“物理制表符”都代表一个缩进级别,您可以将tabstopand设置shiftwidth为您喜欢的缩进级别并保留softtabstop为零(将其设置tabstop为等效,除非您更改tabstop它会不同步,而零只是意味着“请忽略这个”)。

于 2009-10-15T11:59:51.040 回答
2

您对softtabstopand的理解expandtab是错误的-因此stab您建议的选项不会很有用。

expandtab适用于当您想对所有内容使用空格而不是制表符时。如果你设置expandtab了 ,那么 Vim 会忽略该softtabstop选项并使用tabstopandshiftwidth来计算要插入多少个空格。

softtabstop仅当您想混合使用制表符和空格时,允许您通过精细控制(2 或 4 个空格)缩进,同时将制表符宽度保持在较高的值(通常为 8),以便文本出现在其他应用程序中. 设置softtabstop=tabstop不会完成任何事情,因为 Vim 总是使用制表符进行缩进。

更新:正如kaizer.se所指出的,如果您正在使用expandtab,那么您仍然需要设置softtabstop是否希望 Vim 退格多个空格,就好像它们是一个制表符一样。

于 2009-10-14T00:09:40.900 回答
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 的设置方式。

于 2009-10-21T18:33:49.877 回答
1

一个有用的选项是softtabstop=-1将其设置为shiftwidth.
您也可以设置shiftwidth为 0,在这种情况下tabstop将使用该值。

于 2018-03-02T02:40:42.973 回答