【发布时间】: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 php、hobbs 和 kaiser.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 不同的值来实现的额外精细控制。能够使用单个命令将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 之类的建议对我来说仍然听起来不错。
【问题讨论】:
-
您似乎在这里有两个不同的问题,也许您应该将您的问题一分为二。
-
你是对的!我已将第二个问题移到了自己的主题中。
-
这似乎是一个 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