在vim / vimscript中是否有像close-window-hook这样的东西,所以每次窗口关闭时我都可以调用一个函数?
我想将它用于以下场景: 我使用额外的临时窗口来显示有关文件的信息,当我关闭文件时,我希望自动关闭临时窗口,以便退出vim。
如果您有任何想法如何在没有钩子的情况下实现这一点,那就一样好。
编辑:
我知道:qa[ll]
,但我很懒,只想输入:q
或ZZ
。
edit2.71828183: 我接受了autocommand答案,因为它最接近原始问题,但在使用预览窗口而不是分割窗口时找到了另一种解决方案。当最后一个“正常”窗口关闭时,预览窗口会自动关闭..
答案 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!