2009-10-05 133 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具體的東西。