如何捕获Vim中窗口关闭的触发事件?寻找WinClose替代方案
如何追踪Vim执行
:close时触发的事件 嘿,我完全懂你的困扰——Vim确实没有提供和WinNew直接对应的WinClose事件,这确实有点反直觉,毕竟Tab系列都有TabNew和TabClosed成对存在。不过别担心,我们可以通过追踪所有事件的方式,找出执行:close时到底触发了哪些事件,甚至可以模拟出类似WinClose的行为。
方法一:全局监控所有事件
最简单的方式是临时设置一个自动命令,把所有触发的事件都记录下来,这样执行:close时就能一目了然看到对应的事件序列:
- 先打开一个新的临时缓冲区用来记录事件:
:new :set buftype=nofile " 让这个缓冲区不关联文件,避免误保存 - 设置自动命令,将所有事件的触发信息追加到这个缓冲区:
:autocmd * * call append(line('$'), strftime('%H:%M:%S') . " 事件触发:" . expand('<amatch>')) - 现在切换到你想要关闭的窗口,执行
:close命令,再切回记录缓冲区,就能看到所有触发的事件了。
通常执行:close时,你会看到这些核心事件:
WinLeave:离开被关闭的窗口时触发BufLeave:如果被关闭的窗口是该缓冲区的唯一视图,会触发这个WinEnter:关闭窗口后进入剩余的窗口时触发BufEnter:对应进入窗口的缓冲区触发- 如果缓冲区没有其他窗口打开,还会触发
BufUnload或BufDelete
方法二:模拟WinClose事件
如果你需要专门针对窗口关闭的场景,可以结合WinLeave事件和窗口存在性检查,来模拟出类似WinClose的效果:
autocmd WinLeave * if !bufwinnr(expand('<abuf>')) \ | echo "窗口已关闭,对应缓冲区:" . expand('<abuf>') \ | " 这里可以添加你需要执行的自定义逻辑 \ | endif
这个命令的逻辑是:当触发WinLeave时,检查当前缓冲区是否还有对应的窗口存在(bufwinnr返回0表示没有窗口),如果不存在,就说明这个窗口被关闭了,此时可以执行你需要的自定义逻辑。
补充说明
需要注意的是,WinLeave在切换窗口时也会触发,所以必须加上窗口存在性的判断才能准确识别“关闭”动作。而如果是用:quit命令关闭窗口,触发的事件序列和:close基本一致,只是如果是最后一个窗口,还会触发VimLeavePre等退出相关事件。
内容的提问来源于stack exchange,提问作者weilbith
相关产品推荐
相关产品推荐

