为什么:bd#在不存在备用缓冲区的情况下删除当前缓冲区?


9

这是我重现观察到的行为的方式。

首先,我输入以下命令:

echo aaaaa > a
vim a

在Vim中,我输入以下命令:

:ls
:e #
:echo bufname('#')

这是以上三个命令的输出:

:ls
  1 %a   "a"                            line 1

:e #
E194: No alternate file name to substitute for '#'

:echo bufname('#')

bufname('#')命令不产生任何输出。

现在我输入以下命令:

:bd #

当前缓冲区被删除,并用“ [No Name]”缓冲区代替:

:ls
  2 %a   "[No Name]"                    line 1

我期待E194在执行时得到错误:bd #。为什么要删除当前缓冲区呢?

我正在使用VIM - Vi IMproved 8.0


1
这是一个有趣的观点。您可以在问题中提到NVIM v0.3.0-dev,我检查过的情况也是如此。
klaus

@LoneLearner由于悬赏金的缘故,我并没有真正回答这个问题,但是如果您要提供一个奖励,那么如果您将其奖励给一个应该得到的答案,那就太好了……还,您几乎没有登录过周和赏金期结束了……
B层

1
@BLayer对不起,我忘了授予赏金。您写了一个很棒的答案。一旦我在该Stack Exchange网站上获得了足够的积分,我将就这个问题开始另一笔赏金,并将其奖励给您。我希望那可以解决我的错误。感谢您所写的出色答案。
Lone Learner

@LoneLearner嘿,欢迎您,不用担心。感谢您的评论。不用担心赏金。就像我说的不是重点。我只想提醒您下一次您提供赏金时。从这里指向要点。干杯!
B层

Answers:


7

证据

因为没有替代文件,所以您实际上只是在运行普通ol' :bd,删除当前缓冲区...不尝试它#,结果将是相同的。发生类似的情况:buffer:sbuffer并且至少还有另外两个接受#作为参数的命令:它们默默地表现为好像没有传递任何参数。

同样,如果尝试,则会出现:bunload #以下错误:E90: Cannot unload last buffer:bunload不带参数运行,并且再次得到相同的结果。

文件

因此,我们有证据表明该文件#已被“ nothing”(可能是空字符串)代替。我们从这里去哪里?我在帮助文件中打了一段时间,试图找到这种行为的提法。除了:h cmdline-lines说(向下滚动一页或两页)外,什么都没有。

在需要文件名的地方使用字符“%”或“#”时,它们会被扩展为当前文件名和备用文件名。

我读到Vim #遍历expand()函数(即expand('#'))或至少使用那里使用的相同底层代码。

:h expand() 说:

展开..特殊关键字。..当使用'%'或'#'并且未定义当前或备用文件名时,将使用空字符串。

听起来很熟悉。

编码

现在以上都不是确定的,也不是为什么的线索所以我花了更多时间来挖掘……这一次在代码中。我的C是很生疏,我没有安装任何好的工具,但我设法找到,做一些设置为一个功能:bdeletedo_bufdel()。这将发送命令行参数buflist_findpat(),如果#遇到该参数,将返回value curwin->w_alt_fnum。这是备用缓冲区的“缓冲区号” ...在我们的方案中不能为正值。(在选择该返回值之前,不会检查alt文件是否有效/存在。)

在回退do_bufdel()进行检查针对该返回值大于0在此情况下,参数处理循环的爆发制成一个缓冲数少。这将导致没有参数呈现给核心:bdelete代码……这与我之前的直觉相吻合。

下一步是什么?

它似乎按设计工作,因为我没有看到任何看起来像是明显的错误的东西。不过,可能遗漏了罪过……一个被遗忘的角落案例,因此没有优雅的处理方法。但是只有编写此内容的开发人员才能确定。因此,最后一步是尝试获取他们的输入。正如Christian B.所说,在vim-dev列表上询问是要走的路。

(请注意,buflist_findpat()是一个实用功能,因此它不会需要想象力的舒展假设:bunload:buffer等等都在使用它,太...这可以解释相对于它们的共同行为#。)


我认为还有一个仅用于检查扩展缓冲区是否存在的功能可以完成这项工作。您确定这是设计使然吗?我认为应该将其列为错误。
克劳斯,

我认为您的研究是正确的。顺便说一句:我不认为这实际上是一个错误。
Christian Brabandt

我只是总结了一下自己的结论……这看起来不像是一个硬错误。OTOH,如果对此进行思考,可以得出结论,它需要更好的处理。可能只有开发者才能确定。
B层

是的,可以在vim-dev列表上进行确认。
Christian Brabandt
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.