2009-10-05 76 views
2

vim/vimscript中是否存在类似关闭窗口的钩子,这样每次窗口关闭时都可以调用一个函数?如何在vim中关闭缓冲区时执行命令?

我想将它用于以下场景: 我使用额外的临时窗口来显示关于该文件的信息,并且当我关闭文件时,我想让临时窗口自动关闭,以便vim退出。

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

编辑: 我知道约:qa[ll],但我很懒,只想输入:qZZ

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

回答

2

自动命令太棒了!我很确定在这种情况下,BufLeave会完成这项工作,但您可能需要BufWinLeave?查看:help autocmd-events以查看完整的活动列表。

你会关心的另一点是:你可以有缓冲区本地自动命令! (:help autocmd-buflocal

您可以使用au BufLeave <buffer> ...为当前缓冲区定义一个缓冲区。我最好的猜测是,你可以在创建临时窗口的任何命令中运行它。当您打开暂存窗口时,您应该能够缓存暂存窗口的缓冲区编号,然后您的自动命令可以删除该缓冲区(:help :bdelete)。

au BufLeave <buffer> bdelete g:scratch_buffer 
call CreateScratchWindow() 

function CreateScratchWindow() { 
    ... 
    let g:scratch_buffer = bufnr("") 
} 

还有一个函数winbufnr,用于通过窗口获取缓冲区号。你可以使用任何一种 - 只要确保临时窗口/缓冲区在你使用它时是最新的! (“”表示当前窗口/缓冲区)。

+0

自动命令是我在寻找钩子时所要查找的,感谢提示。 但我不能让这个自动命令解决我原来的问题。它关闭暂存缓冲区,但原始文件不关闭! – 0x89 2009-10-05 22:53:58

+0

我想你想'BufUnload'来代替。 – rampion 2009-10-06 01:25:44

+0

@rampion:我相信当一个窗口关闭时,它所包含的缓冲区就会隐藏起来,这不应该触发BufUnload。你真的尝试过了吗? @ 0x89:这很奇怪。自动命令不应该影响自身以外的执行。让它起作用的一种方法可能是让自动命令关闭原始文件。 (使用|连接命令或编写自动命令调用函数) – Cascabel 2009-10-06 02:50:43

-1

您可以使用

:quitall 

:qall 

立刻关闭所有窗口。如果您想忽略未保存的更改,请添加!

:qall! 
+0

对不起,这不是我想要的。无论第一个窗口如何关闭,我都希望第二个窗口自动关闭。这包括ZZ,:q,不管。特别是我不想输入:qa始终,:q硬连线到我的手指上。 – 0x89 2009-10-05 20:26:44

0

添加一个映射。

:nnoremap :q :qa 

那么,如果你只想使用:q有一天,你可以

:qa<backspace> 

,通常,你可以

:q<enter> 

,并得到

:qa<enter> 

是免费的。

0

好吧,不是一个真正的新问题,但我发现它寻找,我现在知道,BufWinLeave。然而,作者描述的场景是我在vimrcNerdTree(例如,当最后一个缓冲区关闭时,我想让vim关闭NerdTree“缓冲区”,然后退出。

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

替换为scratch缓冲是如何确定的NERDTree具体的东西。

相关问题