Vim中的"open buffers"到底是什么?

What exactly are "open buffers" in Vim?

:ls 给出打开缓冲区的列表。我认为一个 window 只能容纳一个缓冲区,而当前缓冲区 = 正在编辑的当前文件。如果我一次只打开一个 window,那么其他“打开的缓冲区”究竟是什么?

:ls:browse oldfiles 有何不同?我注意到后者向我显示了在之前 Vim 会话中打开的文件列表,并且与当前 Vim 会话无关。那么“打开缓冲区”是否意味着当前 Vim 会话中的文件历史记录?

我已经阅读了 https://vimhelp.org/windows.txt.html 但无法就此得出任何结论。

“打开缓冲区”在 Vim 中不是有效术语,AFAIK。命令 :ls 显示列出的缓冲区(并且 :ls! 显示列出的和未列出的缓冲区)。请参阅 :h 'buflisted' 选项。总之,这是一个完全独立的属性。它仅用于“过滤掉”一些缓冲区。

帮助还可能使用术语“隐藏”、“可见”和“加载”。 “loaded”表示缓冲区附加了一些文本内容。 “可见”- 它显示在一个或多个 windows 中。请注意,所有“可见”缓冲区均已“加载”,但反之亦然。

“隐藏”相当不正式,通常表示缓冲区已“加载”,但不是“可见”(即显示为零 windows)。还要注意,可能有许多既不“加载”也不“可见”的缓冲区。这是当前会话的一种“编辑历史”。它们可以在 ls 输出中浮动,但不会占用太多 RAM 等。

oldfiles 不是缓冲区。这是以前运行的“历史”。它可以用来快速re-open一些文件。然后将创建一个有效的缓冲区。

这里有补充点……

缓冲区 Vim 与更熟悉的程序中的“文档”完全相同。

  • 当您在 Word 中创建新文档时,程序会在内存中分配一些 space,并为其指定一个临时名称,例如 Document1。那时,您有一个名为 Document1 的“文件”,但磁盘上没有文件。

    这正是您执行 $ vim non_existing_file 时发生的情况,唯一的区别是您得到的称为“缓冲区”,而不是“文档”。您得到一个名为 non_existing_file 的“缓冲区”,但磁盘上没有文件。

  • 当您在 Word 中打开现有文件时,程序会执行与上述相同的操作,并将文档映射到磁盘上的文件。此时,您有两个实体,文档充当文件的代理。

    这正是您在 Vim 中执行 :e existing_file 时发生的情况。

  • 当您在 Word 中保存文档时,程序实质上会尝试协调文档的状态和文件的状态。如果没有与该文档关联的文件,则提示您创建一个,如果有,则透明写入该文件。

    当有document/file关系时,在Vim中基本相同::w existing_file用缓冲区existing_file的内容覆盖文件existing_file

    没有文件时的行为略有不同:Vim如果有一个文件,将写入一个带有缓冲区名称的文件,或者如果缓冲区未命名,则中止并抱怨。

综上所述,缓冲区并不像看起来那么奇怪。

What exactly are other "open buffers" if I have exactly one window open at a time?

就像您可以在 Word 中同时处理多个“文档”一样,您可以在 Vim 中处理多个“缓冲区”。就像您可以访问 Word 中的其他文档一样,您可以访问 Vim.

中的其他缓冲区

在当前会话期间代表您创建的每个新缓冲区都会添加到全局“缓冲区列表”中,:ls 只是显示这些缓冲区的一种方式,以便您可以对它们发出命令用于导航或管理。

请注意,该列表是 global,因此 :ls 将显示相同的列表,无论您是在一个 window 还是另一个,还是在一个标签页或其他。请参阅 this other answer of mine 了解缓冲区、windows 和标签页之间的关系。

至于为什么你在列表中看到的项目比预期的多,有很多解释,但用一个最小的可重现案例来解释会更容易。

How is :ls different from :browse oldfiles?

前者列出了在当前会话期间创建的缓冲区。后者列出了在上次写入 ~/.viminfo 文件之前创建的缓冲区,这些缓冲区可以概括为 在之前的会话 .

期间创建的缓冲区