首页 > 解决方案 > Vim 选项作用域:global-local、local 和 global

问题描述

Vim 帮助文档对|options|选项和选项值进行了区分;以及在全局、本地和全局-本地选项之间。这非常令人困惑,尤其是考虑到|local-options|

“可以专门为一种缓冲区设置本地窗口选项.... Vim 保留本地窗口选项的全局值,在编辑另一个缓冲区时使用。每个窗口都有自己的这些值的副本。因此,这些对窗口来说是本地的,但对窗口中的所有缓冲区都是全局的。”

在随后的示例中,它显示了:setlocal list使本地窗口选项成为缓冲区的本地选项。但是全局或全局本地窗口选项呢?

谁能解释选项和价值之间以及三种选项之间的术语差异的原因?

标签: vim

解决方案


嗯,这很容易,IMO。想想一个选项的用途。

说,confirm是全局的,因为它对每个 Vim 实例都有意义。因此,即使您执行setlocal confirm,也会默默地更改全局选项,因为它是唯一存在的选项。

接下来,expandtab是每个缓冲区的本地选项(注意:某些选项可以是每个窗口的本地选项:h 'diff',例如 )。但是,同时存在全局expandtab(本质上是expandtab新创建缓冲区的“当前默认值”)和本地expandtab(每个现有缓冲区一个)。另请注意,一些“默认值”几乎没有用(例如,无论如何filetype都会设置ftdetect,但尽管如此,全局filetype存在)。

现在,什么是全球本地的东西?这只是一个可能(或可能不会)为每个现有缓冲区创建的选项。但是,当然,这种类型的全局选项总是存在的。

它与普通的本地选项有何不同?假设你的 vimrc 中有:

setglobal noexpandtab noautoread

现在你运行你的 Vim 并输入:

:setlocal expandtab? autoread?

然后你得到回应:

noexpandtab
--autoread

这意味着你有一个global的缓冲区本地副本expandtab,但 localautoread根本没有在当前缓冲区中创建,所以 Vim 会使用一个全局值。

综上所述:

  1. “全局选项”意味着根本不存在局部值。所以总是使用全局值。

  2. “本地选项”意味着所有缓冲区(或窗口)始终拥有自己的副本,因此“全局”值仅作为默认值有意义。

  3. “全局本地选项”意味着一些缓冲区(或窗口)可能有它们的副本,但其他可能没有。所以 Vim 如果设置了则使用当前的本地选项,否则使用全局选项。


推荐阅读