Tab与Vim中的Space首选项


87

Vim在选项卡Vs方面非常宽容。空间偏好。据我了解,该tabstop设置指示制表符的宽度。该shiftwidth设置指定使用<<>>命令时要增加/减少多少列,而该softtabstop设置会影响Tab在插入模式下按键时要插入的空白量。如果expandtab启用,Tab键将插入softtabstop多个空格字符。而在expandtab关闭的情况下,按键将Tab插入与匹配的最小数量的Tab +空格字符softtabstop。(如果我错了,请纠正我。)

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

:set stab=4

这相当于运行:

:set tabstop=4 softtabstop=4 shiftwidth=4 

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


更新

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

Softtabstop,expandtab关闭

我在上面说过,在关闭expandtab的情况下,按Tab键会插入与匹配的Tab +空格字符,数量最少softtabstop。我支持这一点,但我认为我需要解释一下我的意思。我将通过一些示例来尝试这样做。要继续,请运行:set list以使您可以看到制表符。

tabstop=4 softtabstop=2 shiftwidth=4 noexpandtab

在插入模式下,按Tab键将插入2个空格字符。再按一次Tab键,而不是再插入两个空格字符(总共4个空格字符),而是用一个制表符替换前2个空格。制表符设置为4,因此单个制表符的宽度与4个空格相同。

tabstop=4 softtabstop=6 shiftwidth=4 noexpandtab

在插入模式下,按Tab键将插入1个制表符和2个空格。制表符的宽度为4,因此总宽度为6,这是使用3个字符实现的。第二次按Tab键将插入两个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开机状态,则希望使用Delete键删除与Tab键插入相同的空格。所以在这种情况下,我也觉得这将是能够分配相同的值非常有用tabstopsofttabstopshiftwidth同时进行。

快捷方式仍然有用

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

因此,我提出的类似建议对:set stab=4我来说仍然很不错。


似乎您在这里有两个不同的问题,也许您应该将问题分为两个。
Greg Hewgill

你是对的!我已经将第二个问题移到它自己的主题中。
纳尔斯特罗姆,

1
这似乎是一个RFE,而不是一个问题。因此,您可能应该向VIM社区提出建议:vim.org/community.php或直接编写一个补丁。除此之外,VIM还具有广泛的宏功能,可让您定义新的操作,因此很可能您可以简单地创建一个可以执行所需操作的宏。
kdgregory,

@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拥有的价值无关。
jamessan 2014年

Answers:


56

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

“将所有这些放入您的.vimrc或插件文件中
命令!-nargs = *刺叫Stab()
功能!刺()
  令l:tabstop = 1 * input('set shiftwidth =')

  如果l:tabstop> 0
    ”我们是否还需要expandtab?
    让l:expandtab =确认(“设置expandtab?”,“&是\ n&否\ n&取消”)
    如果l:expandtab == 3
      ”中止?
      返回
    万一

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

    如果l:expandtab == 1
      setlocal expandtab
    其他
      setlocal noexpandtab
    万一
  万一

  ”显示选定的选项
  尝试
    回声模式消息
    echo'set tabstop ='
    echohl问题
    回声&l:ts
    回声模式消息
    呼应'shiftwidth ='
    echohl问题
    回声&l:sw
    回声模式消息
    呼应'sts ='
    echohl问题
    echon&l:sts。''。(&l:et?'':'no')
    回声模式消息
    呼应'expandtab'
  最后
    echohl无
  努力
终端功能

3
感谢您的脚本!它的功能超出了我的要求-我想我不想保留expandtab-但我可以根据自己的喜好轻松对其进行自定义。您已为我提供了Vimscript的小型速成课程,非常感谢。100点赏金属于您!
纳尔斯特罗姆

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分,现在我自己解决了一半。不知道我是否可以接受自己的答案...


+1是的,但是如果这是您真正想要的,那仍然是一个好的答案。
DaveParillo

2
您可能需要使用let&l:shiftwidth等设置本地版本。
SystemParadox 2012年

7

您可以在编辑模式下也可以使用Ctrl-T缩进和Ctrl-D以deindent到下一个缩进级别由一套shiftwidth,不管tabstopsofttabstopexpandtab设置。Vim会自动添加/删除空格或制表符,将您带到右栏。

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


3

如果expandtab设置了(因为过多的php指出),则softtabstop变得多余。您可能设定与之shiftwidth不同的唯一原因tabstop是为了迎合一个奇怪的习惯。例如,您使用四个空格缩进,但您希望tab插入八个空格。

如果expandtab未设置,则事情变得更加模糊。如果您希望代码在cat非vim编辑器中和在非vim编辑器中看起来一样,tabstop则应始终设置为8;在这种情况下,你会设置softtabstopshiftwidth两个你喜欢的缩进水平。相反,如果您希望文件中的每个“物理选项卡”都代表一个缩进级别,则可以设置tabstop并设置shiftwidth为您的首选缩进级别,并保留softtabstop为零(将其设置为等于是tabstop等效的,除了如果进行更改tabstop,它将不同步,而零则表示“请忽略此信息”)。


3
我认为这是错误的,因为只有将其softtabstop设置为正确的值,退格键才会删除空格缩进,就好像它是一个制表符一样。理智使用是必须的。
u0b34a0f6ae

2

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

expandtab当您想使用空格而不是制表符来表示所有内容时。如果设置expandtab,则Vim会忽略该softtabstop选项并使用tabstopshiftwidth来计算要插入的空间。

softtabstop仅用于当您希望使用制表符和空格的混合使用时,允许您缩进缩进(2或4个空格),同时将制表符宽度保持较高的值(通常为8),以便在其他应用程序中出现。设置softtabstop=tabstop没有完成任何事情,因为Vim将始终使用制表符进行缩进。

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


虽然您是正确的,tabstop并且softtabstopextpandtab设置时成为太多变量,但我认为您在优先级上是错误的。尝试一下:设置ts=8 sts=4 et并按Tab;光标将位于第五列,并且将插入四个空格,就像您已设置一样ts=4 sts=0 et
hobbs

5
我认为这是错误的,因为只有将其softtabstop设置为正确的值,退格键才会删除空格缩进,就好像它是一个制表符一样。理智使用是必须的。
u0b34a0f6ae

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设置方式。


1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.