2011-04-24 93 views
7

根据answer of this question:bd当它是最后一个缓冲区时不应该退出Vim(GVim)。不幸的是,它在我的情况下关闭了GVim。我了解bd有什么问题吗?Vim在缓冲区删除后退出(bd)

我也在使用预配置的vimrc文件。也许在那里有一个设置有影响,但我找不到它。

+0

我试过你的.vimrc文件,但没有相同的问题。它一定是别的东西导致它。 – nocash 2011-04-24 01:21:56

+0

感谢您试用我的vimrc。正如ZyX所说,它似乎是一个插件的问题。我在他的回答下发布了他推荐的命令的输出。 – Zardoz 2011-04-24 10:04:26

+1

我真的很好奇插件是怎么造成的。我希望实际上拥有这个功能。 – 2014-07-22 09:43:15

回答

15

试着做以下几点:

:set eventignore=all | bd | set eventignore= 

如果这不会退出VIM然后你有一些插件,它定义了退出的时候没有更多的缓冲区在列表VIM自动命令,让后尝试做

verbose autocmd BufWinLeave,BufLeave,BufDelete,BufUnload,BufWipeout 

这将显示您连接到给定事件的所有自动命令(这些都是当缓冲区被删除时执行的事件),并定义它们的位置。请注意,我没有任何自动命令附加到由standart vim distribution中的插件定义的这些事件。

更新:我没有看到你的输出有什么不好。你也可以尝试

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在>之上显示的内容。

+0

谢谢你的提示。事实上,这似乎是一个插件。我按照你的建议运行verbose命令,得到如下结果:https://gist.github.com/939432你知道哪些插件导致了它,以及如何覆盖它? – Zardoz 2011-04-24 09:14:03

+0

@ Zardoz查看更新。 – ZyX 2011-04-24 12:01:35

+0

不知道什么解决了问题,但它不再发生。如果它再次出现,我会留下评论什么插件造成它。谢谢您的帮助。 – Zardoz 2011-04-24 13:18:43