当vim中的缓冲区关闭时,如何执行命令?
vim/vimscript中是否有类似于关闭窗口钩子的东西,以便我可以在每次关闭窗口时调用函数 我想将其用于以下场景: 我使用一个额外的scratch窗口来显示关于文件的信息,当我关闭文件时,我希望scratch窗口自动关闭,以便vim退出 如果你有任何想法如何实现这一点,没有一个钩子,这将是一样好 编辑: 我知道当vim中的缓冲区关闭时,如何执行命令?,vim,vi,Vim,Vi,vim/vimscript中是否有类似于关闭窗口钩子的东西,以便我可以在每次关闭窗口时调用函数 我想将其用于以下场景: 我使用一个额外的scratch窗口来显示关于文件的信息,当我关闭文件时,我希望scratch窗口自动关闭,以便vim退出 如果你有任何想法如何实现这一点,没有一个钩子,这将是一样好 编辑: 我知道:qa[ll],但我很懒,只想键入:q或ZZ edit2.71828183: 我接受了自动命令的答案,因为它最接近原始问题,但通过使用预览窗口而不是拆分窗口,我找到了另一种解决方案。当
: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
中设置了“隐藏”,因此当我关闭第一个缓冲区时,它会变得隐藏,然后自动命令会关闭另一个缓冲区,这使得第一个窗口再次可见-很棘手!这样我就可以关上非盟的窗户。但我找到了另一个解决方案:我使用预览窗口而不是拆分窗口(请参阅:帮助预览)。当没有其他窗口时,它会自动关闭..哦!对不起,我本来是想建议的,但是被缓冲区本地自动命令完全分散了注意力。