当vim中的缓冲区关闭时,如何执行命令?

当vim中的缓冲区关闭时,如何执行命令?,vim,vi,Vim,Vi,vim/vimscript中是否有类似于关闭窗口钩子的东西,以便我可以在每次关闭窗口时调用函数 我想将其用于以下场景: 我使用一个额外的scratch窗口来显示关于文件的信息,当我关闭文件时,我希望scratch窗口自动关闭,以便vim退出 如果你有任何想法如何实现这一点,没有一个钩子,这将是一样好 编辑: 我知道:qa[ll],但我很懒,只想键入:q或ZZ edit2.71828183: 我接受了自动命令的答案,因为它最接近原始问题,但通过使用预览窗口而不是拆分窗口,我找到了另一种解决方案。当

vim/vimscript中是否有类似于关闭窗口钩子的东西,以便我可以在每次关闭窗口时调用函数

我想将其用于以下场景: 我使用一个额外的scratch窗口来显示关于文件的信息,当我关闭文件时,我希望scratch窗口自动关闭,以便vim退出

如果你有任何想法如何实现这一点,没有一个钩子,这将是一样好

编辑: 我知道
:qa[ll]
,但我很懒,只想键入
:q
ZZ

edit2.71828183: 我接受了自动命令的答案,因为它最接近原始问题,但通过使用预览窗口而不是拆分窗口,我找到了另一种解决方案。当最后一个“正常”窗口关闭时,预览窗口将自动关闭。

您可以使用

:quitall

一次关闭所有窗口

添加一个
如果要忽略未保存的更改

:qall!
添加映射

:nnoremap :q :qa
然后,如果您只想使用
:q
一天,您可以

:qa<backspace>
:q<enter>
:qa
通常,你可以

:qa<backspace>
:q<enter>
:q
得到

:qa<enter>
:qa

免费。

自动命令太棒了!我很确定在这种情况下,
buflive
将完成这项工作,但您可能需要
BufWinLeave
?有关事件的完整列表,请查看
:help autocmd events

您需要关心的另一点是:您可以使用缓冲区本地自动命令!(
:help autocmd buflocal

您可以使用
au bufleve…
为当前缓冲区定义一个缓冲区。我的最佳猜测是,您可以在创建scratch窗口的任何命令中运行它。打开“暂存”窗口时,您应该能够将暂存窗口的缓冲区编号缓存在全局变量中,然后自动命令可以删除该缓冲区(
:help:bdelete

au bufleve bdelete g:scratch\u缓冲区
调用CreateScratchWindow()
函数CreateScratchWindow(){
...
设g:scratch_buffer=bufnr(“”)
}

还有一个函数winbufnr,用于按窗口获取缓冲区编号。您可以使用其中任何一个-只需确保在使用时临时窗口/缓冲区是最新的!(“”表示当前窗口/缓冲区)。

好的,这不是一个新问题,但我发现它在寻找我现在知道的,
BufWinLeave
。然而,作者所描述的场景是我在
vimrc
NerdTree
中的场景,例如,当最后一个缓冲区关闭时,我希望vim关闭
NerdTree
“缓冲区”,然后退出

autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif

NERDTree
特定内容替换为如何识别
scratch
缓冲区。

对不起,这不是我想要的。我希望第二个窗口自动关闭,无论第一个窗口如何关闭。包括ZZ,:q,随便什么。特别是我不想一直键入:qa,:q是硬连接到我的手指上的..自动命令是我在请求钩子时想要的,谢谢你的提示。但是我不能让这个自动命令解决我原来的问题。它会关闭暂存缓冲区,但原始文件不会关闭!我想你想要的是
BufUnload
。@Rapion:我相信当窗口关闭时,它包含的缓冲区会隐藏起来,这不应该触发
BufUnload
。你真的试过吗@0x89:这很奇怪。自动命令不应影响自身之外的执行。让它工作起来的一个困难可能是让自动命令也关闭原始文件。(使用|连接命令,或编写自动命令调用函数)是否隐藏或卸载缓冲区取决于
hidden
设置以及
bufhidden
选项。也许这就是解决方案:我在我的
.vimrc
中设置了“隐藏”,因此当我关闭第一个缓冲区时,它会变得隐藏,然后自动命令会关闭另一个缓冲区,这使得第一个窗口再次可见-很棘手!这样我就可以关上非盟的窗户。但我找到了另一个解决方案:我使用预览窗口而不是拆分窗口(请参阅:帮助预览)。当没有其他窗口时,它会自动关闭..哦!对不起,我本来是想建议的,但是被缓冲区本地自动命令完全分散了注意力。