“ set”命令仅影响活动缓冲区吗?


14

我在vim中有两个缓冲区:

:ls
  1 %a   ".vimrc"                       line 1
  2 #h   "script.sh"                    line 1
Press ENTER or type command to continue

如上所示,我在第一个缓冲区。现在,如果我执行该:set softtabstop=16命令,那么我希望它会影响两个缓冲区。但是,情况并非如此-虽然sts第一个缓冲区的值确实已更改,并且Tab键插入了四个制表符(ts=4),但对于第二个缓冲区,该sts值仍为4

:ls
  1 #h + ".vimrc"                       line 1
  2 %a + "script.sh"                    line 1
  softtabstop=4
Press ENTER or type command to continue

为什么会这样?我认为这set会影响所有缓冲区,而setlocal只会影响活动缓冲区。

Answers:


25

选项可以是globalwindow-localbuffer-local

当您:set使用全局选项时,新值是global

当你:setlocal一个全球性的选项,即新的地方

当您:set使用本地选项时,新值是local

softtabstop作为本地缓冲区选项,更改其值只会影响当前缓冲区。

选项的“范围”在:help option

'softtabstop' 'sts'    number    (default 0)
                       local to buffer
                       {not in Vi}
Number of spaces that a <Tab> counts[...]

:help local-options:help :setlocal然后:help global-local更详细地说明所有这些。


3
还有一个:setglobal
佐藤桂2016年

3
同样,某些选项是全局的,无论您如何设置它们。例如'encoding'
2016年

有没有一种方法可以通过某些vimscript函数调用通过缓冲区ID和选项值来设置局部函数?
圣安塔里奥

有一个函数setbufvar可以用来实现这一目标。最初没有找到它。
圣安东尼奥

2

@Martin不是专家,但是通过阅读:help set您需要“取消设置” sts每个缓冲区的本地值,以使该缓冲区接收任何新的全局值。 setlocal sts= (或用于布尔标志setlocal flag<)。Kinda很有道理,本地设置在打开时初始化为当前的全局值,然后保留本地值,直到另行告知。如果没有本地设置在起作用,它应该选择任何新的全局值。

同样,如果不是专家,我会猜测第二个缓冲区在第二个缓冲区之前具有显式的本地设置set超过50/50,我的理解是错误的,因为我还在之间的区别是什么不清楚setsetglobal

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.