【问题标题】:Tab Vs Space preferences in VimVim 中的 Tab Vs Space 首选项
【发布时间】:2023-03-03 02:27:01
【问题描述】:

Vim 对 tab 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 

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


更新

感谢到目前为止 too much phphobbskaiser.se 的回复。我没有单独回复每个问题,而是在此处更新问题。

Softtabstop 与 expandtab 关闭

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

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

快捷方式仍然有用

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

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

【问题讨论】:

  • 您似乎在这里有两个不同的问题,也许您应该将您的问题一分为二。
  • 你是对的!我已将第二个问题移到了自己的主题中。
  • 这似乎是一个 RFE,而不是一个问题。因此,您可能应该向 VIM 社区提议:vim.org/community.php——或者干脆写一个补丁。除此之外,VIM 有一个广泛的宏工具,允许你定义新的操作,所以你很可能可以简单地创建一个你想要的宏。
  • @nelstrom 关于你的问题is there a practical case where you wouldn't want shiftwidth == tabstop && tabstop == softtabstop?,Vim 自己的源代码使用set shiftwidth=4 tabstop=8 noexpandtab。是的,通常需要shiftwidth == softtabstop,但这与tabstop 的价值无关。

标签: vim whitespace preferences


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      " 将所有这些放在你的 .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' 最后 回声无 终试 结束功能

      【讨论】:

      • 感谢脚本!它做的比我要求的要多——我想我更愿意将 expandtab 排除在外——但我可以根据自己的喜好轻松自定义它。你为我提供了一个关于 Vimscript 的小型速成课程,所以我非常感激。 100 分赏金是你的!
      【解决方案4】:

      您是否经常更改空白设置,您真的需要一个函数来管理它?如果您经常使用 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 的设置方式。

      【讨论】:

        【解决方案5】:

        这是我第一次尝试编写 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 分的赏金,现在我自己解决了一半。不确定我是否可以接受我自己的答案...

        【讨论】:

        • +1 是的,但如果这是你真正想要的,它仍然是一个好的答案。
        • 你可能想要使用 let &l:shiftwidth 等来设置本地版本。
        【解决方案6】:

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

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

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

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

        【讨论】:

        • extpandtab 设置时tabstopsofttabstop 成为一个变量太多是对的,但我认为你在优先级上是错误的。试试看:设置ts=8 sts=4 et 并按tab;光标将位于第五列,并插入四个空格,就像您设置了ts=4 sts=0 et
        • 我认为这是错误的,因为只有将 softtabstop 设置为正确的值,退格键才会删除空格缩进,就好像它是一个制表符一样。这是理智使用的必要条件。
        【解决方案7】:

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

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

        【讨论】:

        • 我认为这是错误的,因为只有将softtabstop 设置为正确的值,退格键才会删除空格缩进,就好像它是一个制表符一样。这是理智使用的必要条件。
        猜你喜欢
        • 2015-03-19
        • 1970-01-01
        • 2019-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-04
        • 1970-01-01
        • 2010-12-06
        相关资源
        最近更新 更多