当运行 ':bdelete' 命令时,为什么 Vim 会退出?

9
根据这个问题的答案,当:bd是最后一个剩余的缓冲区时,该命令不应退出Vim(gVim)。但不幸的是,在我的情况下它确实关闭了gVim。我对:bd有误解吗?
我也在使用预配置的vimrc文件。也许其中的设置产生了这种副作用,但我找不到它。

我尝试了你的 .vimrc 文件,但是我没有遇到同样的问题。这一定是其他原因导致的。 - nocash
感谢尝试我的vimrc。正如ZyX所提到的,似乎是某个插件出了问题。我在他的回答下发布了他推荐命令的输出结果。 - medihack
1
我真的很好奇是哪个插件导致了这个问题。因为我实际上想要这个功能。 - Evan Purkhiser
1个回答

16

尝试按照以下步骤操作:

:set eventignore=all | bd | set eventignore=
如果这样不能退出 vim 的话,那么你可能有一些插件定义了一个自动命令,当缓冲区列表中没有更多的缓冲区时退出 vim,因此你可以尝试执行以下操作:
verbose autocmd BufWinLeave,BufLeave,BufDelete,BufUnload,BufWipeout

这将向您展示所有附加到给定事件的自动命令(这些事件在缓冲区被删除时执行),以及它们定义的位置。请注意,我没有附加到由标准 vim 发行版中的插件定义的这些事件上的任何自动命令。

更新:我没有看到你输出的任何错误。你也可以尝试

verbose autocmd BufNew,BufAdd,BufCreate,BufEnter,BufWinEnter

(因为当你离开最后一个缓冲区时,会创建一个新的空缓冲区)。如果这没有显示任何可疑的内容,请开始忽略事件类型:如果你在Linux上,请尝试以下脚本:

for event in BufWinLeave BufLeave BufDelete BufUnload BufWipeout BufNew BufAdd BufCreate BufEnter BufWinEnter
do
    event=$event vim file -c "set eventignore=$event | bd"
done
这个脚本应该重复执行,直到找到导致问题的事件名称。之后,您可以在vim中使用execute "verbose autocmd" $event来缩小需要检查的插件数量。在您得到自动命令组列表之后(augroup名称会显示在输出中的事件名称之前:railsPluginDetect就是这样的一组),删除其中的事件(augroup {GroupName} | execute 'autocmd!' | augroup END),并找出要申报的插件。
或者,您也可以使用调试器:
debug bd

然后输入s<CR>n<CR><CR><CR>... 直到vim退出;在退出前不要忘记记住vim在>提示符上方显示的内容。


谢谢你的提示。的确,看起来是一个插件完成了这个功能。我按照你的建议运行了详细命令,并得到了以下结果:https://gist.github.com/939432 你有没有想法,是哪一个插件造成了这个问题,以及如何再次覆盖它? - medihack
不确定问题是如何解决的,但它不再出现了。如果再次出现,我会留下评论说明是哪个插件引起的。感谢您的帮助。 - medihack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接