尝试执行以下操作:
: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 来减少应检查的插件数量。在获得 autocmd 组列表后(augroup 名称显示在输出中的事件名称之前:railsPluginDetect 是此类组之一),删除其中的事件 (augroup {GroupName} | execute 'autocmd!' | augroup END) 并找出要声明的插件。
或者,您可以使用调试器:
debug bd
,然后 s<CR>n<CR><CR><CR>... 直到 vim 退出;退出前不要忘记记住 vim 在> 提示上方显示的内容。