在vim中关闭缓冲区时如何执行命令?

时间:2009-10-05 20:15:44

标签: vim vi

在vim / vimscript中是否有像close-window-hook这样的东西,所以每次窗口关闭时我都可以调用一个函数?

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

如果您有任何想法如何在没有钩子的情况下实现这一点,那就一样好。

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

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

4 个答案:

答案 0 :(得分: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,用于通过窗口获取缓冲区数。您可以使用其中任何一个 - 只需确保使用它时临时窗口/缓冲区是最新的! (“”表示当前窗口/缓冲区。)

答案 1 :(得分:0)

添加映射。

:nnoremap :q :qa

然后,如果您有一天只想使用:q,那么就可以

:qa<backspace>

通常,你可以

:q<enter>

并获取

:qa<enter>

免费。

答案 2 :(得分:0)

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

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

NERDTree具体内容替换为scratch缓冲区的识别方式。

答案 3 :(得分:-1)

您可以使用

:quitall

:qall

立即关闭所有窗口。

如果您想忽略未保存的更改,请

添加!

:qall!