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
文件之前创建的缓冲区,这些缓冲区可以概括为 在之前的会话 .
期间创建的缓冲区
: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
文件之前创建的缓冲区,这些缓冲区可以概括为 在之前的会话 .