证据
因为没有替代文件,所以您实际上只是在运行普通ol' :bd
,删除当前缓冲区...不尝试它#
,结果将是相同的。发生类似的情况:buffer
,:sbuffer
并且至少还有另外两个接受#
作为参数的命令:它们默默地表现为好像没有传递任何参数。
同样,如果尝试,则会出现:bunload #
以下错误:E90: Cannot unload last buffer
。:bunload
不带参数运行,并且再次得到相同的结果。
文件
因此,我们有证据表明该文件#
已被“ nothing”(可能是空字符串)代替。我们从这里去哪里?我在帮助文件中打了一段时间,试图找到这种行为的提法。除了:h cmdline-lines
说(向下滚动一页或两页)外,什么都没有。
在需要文件名的地方使用字符“%”或“#”时,它们会被扩展为当前文件名和备用文件名。
我读到Vim #
遍历expand()
函数(即expand('#')
)或至少使用那里使用的相同底层代码。
:h expand()
说:
展开..特殊关键字。..当使用'%'或'#'并且未定义当前或备用文件名时,将使用空字符串。
听起来很熟悉。
编码
现在以上都不是确定的,也不是为什么的线索?所以我花了更多时间来挖掘……这一次在代码中。我的C是很生疏,我没有安装任何好的工具,但我设法找到,做一些设置为一个功能:bdelete
叫do_bufdel()
。这将发送命令行参数buflist_findpat()
,如果#
遇到该参数,将返回value curwin->w_alt_fnum
。这是备用缓冲区的“缓冲区号” ...在我们的方案中不能为正值。(在选择该返回值之前,不会检查alt文件是否有效/存在。)
在回退do_bufdel()
进行检查针对该返回值大于0在此情况下,参数处理循环的爆发制成一个缓冲数少。这将导致没有参数呈现给核心:bdelete
代码……这与我之前的直觉相吻合。
下一步是什么?
它似乎按设计工作,因为我没有看到任何看起来像是明显的错误的东西。不过,可能遗漏了罪过……一个被遗忘的角落案例,因此没有优雅的处理方法。但是只有编写此内容的开发人员才能确定。因此,最后一步是尝试获取他们的输入。正如Christian B.所说,在vim-dev列表上询问是要走的路。
(请注意,buflist_findpat()
是一个实用功能,因此它不会需要想象力的舒展假设:bunload
,:buffer
等等都在使用它,太...这可以解释相对于它们的共同行为#
。)
NVIM v0.3.0-dev
,我检查过的情况也是如此。