【问题标题】:Why might Vim quit when the ‘:bdelete’ command is run?为什么在运行 ‘:bdelete’ 命令时 Vim 会退出?
【发布时间】:2011-04-24 01:08:23
【问题描述】:

根据answer of this question:bd 命令在 Vim (gVim) 是剩余的最后一个缓冲区时不应退出。不幸的是,就我而言,它确实关闭了 gVim。我对:bd 有什么误解吗?

我也在使用预配置的vimrc 文件。也许那里的设置有这种副作用,但我找不到。

【问题讨论】:

  • 我试过你的 .vimrc ,但没有同样的问题。一定是其他原因造成的。
  • 感谢您试用我的 vimrc。正如 ZyX 提到的,这似乎是某些插件的问题。我在他的回答下发布了他推荐的命令的输出。
  • 我真的很好奇是什么插件导致了这种情况。因为我想真正拥有这个功能。

标签: vim


【解决方案1】:

尝试执行以下操作:

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

【讨论】:

  • 感谢您的提示。确实,插件似乎可以做到这一点。我按照您的建议运行了详细命令并得到了以下结果:gist.github.com/939432您知道哪些插件会导致它以及如何再次覆盖它吗?
  • 不确定是什么解决了问题,但它不再发生。如果它再次出现,我会留下评论是什么插件引起的。感谢您的帮助。
猜你喜欢
  • 2011-03-09
  • 2020-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多