为什么 Vim 选项被记录为由新缓冲区继承的“本地缓冲区”?

Lon*_*ner 1 vim tabs buffer

我在一个空目录中按如下方式启动 Vim。

vim -u NONE foo.txt
Run Code Online (Sandbox Code Playgroud)

然后我在 Vim 中输入以下命令。

:set ts=40
Run Code Online (Sandbox Code Playgroud)

现在,如果我按 Tab,光标确实会移动到第 41 列。

现在我在 Vim 中输入以下命令。

:e! bar.txt
Run Code Online (Sandbox Code Playgroud)

现在,如果我按 Tab 键并且光标再次移动到第 41 列。这让我很惊讶。我期待光标移动到第 9 列。

事实上,:help 'ts显示如下。

                        *'tabstop'* *'ts'*
'tabstop' 'ts'      number  (default 8)
            local to buffer
    Number of spaces that a <Tab> in the file counts for.  Also see
    |:retab| command, and 'softtabstop' option.
Run Code Online (Sandbox Code Playgroud)

帮助说ts选项是local to buffer. 为什么我ts=40在一个缓冲区中设置的选项会应用于另一个新缓冲区?

rom*_*inl 5

“本地到缓冲区”意味着新值不会影响其他现有缓冲区。

假设在您中tabstop设置为并且您使用两个缓冲区启动 vim:4vimrc

$ vim a.txt b.txt
Run Code Online (Sandbox Code Playgroud)

的初始值tabstop是由两个缓冲器,从而继承a.txtb.txttabstop设定为4

如果你这样做:set tabstop=7a.txtb.txt仍然会有以前的值4。这就是“本地到缓冲区”的意思。

但是当你创建一个新的缓冲区时,这个新缓冲区会继承当前缓冲区的设置,所以ts=7如果当前缓冲区有7ts=4如果它是4,等等,你将在新缓冲区中获得。

然后是:setlocal设置一个不会被新缓冲区继承的本地值。