缓冲区删除后退出Vim(bd)

Zar*_*doz 9 vim

根据这个问题答案,:bd当它是最后一个缓冲区时,不应该退出Vim(GVim).不幸的是,在我的情况下它确实关闭了GVim.我对bd有什么不妥吗?

我还使用预配置的vimrc 文件.也许那里的场景会产生那种影响,但我找不到它.

ZyX*_*ZyX 16

尝试执行以下操作:

:set eventignore=all | bd | set eventignore=
Run Code Online (Sandbox Code Playgroud)

如果这不会退出vim那么你有一些插件定义了一个自动命令,当列表中不再有缓冲区时退出vim,所以在那之后尝试做

verbose autocmd BufWinLeave,BufLeave,BufDelete,BufUnload,BufWipeout
Run Code Online (Sandbox Code Playgroud)

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

更新:我的输出中没有看到任何不良内容.你也可以试试

verbose autocmd BufNew,BufAdd,BufCreate,BufEnter,BufWinEnter
Run Code Online (Sandbox Code Playgroud)

(因为当你离开最后一个缓冲区时,会创建一个空的缓冲区).如果这没有显示任何可疑的内容,请开始忽略事件类型:如果您在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
Run Code Online (Sandbox Code Playgroud)

此脚本应该迭代,直到找到导致问题的事件名称.在此之后,您可以execute "verbose autocmd" $event在vim 中使用以缩小应检查的插件数量.获得autocmd组列表后(在输出中的事件名称之前显示的是组合名称:railsPluginDetect是其中一个组),删除它们中的事件(augroup {GroupName} | execute 'autocmd!' | augroup END)并找出要声明的插件.

或者,您可以使用调试器:

debug bd
Run Code Online (Sandbox Code Playgroud)

然后s<CR>n<CR><CR><CR>...直到vim退出; 不要忘记>在退出之前记住vim上面显示的内容.