2011-12-23 30 views
3

我已經在我的插件自動命令的BufWritePost裏。 (我更新標籤在此自動命令,這是插件Indexer.tar.gz整個項目)自動命令執行只有一次後,許多文件保存(:WA)

有時候我需要保存多個文件(我願意「:WA」)。當然,我的autocmd被稱爲每個文件。

我想使它打電話只是畢竟filesaves。比方說,如果我有20個未保存的緩衝區,我這樣做:wa,並且在最後一個緩衝區被保存後,我的autocmd被調用一次。 有什麼辦法可以做到嗎?

其實這個插件是足夠聰明,它開始在CTAGS背景如果有可能,但無論如何,這是一個有點討厭。沒有自動命令

+0

你能解釋一下什麼是你想用自動命令呢?一般來說? – Rook 2011-12-23 12:40:00

+0

@ldigas,我已經寫道:我在這個自動命令中更新整個項目的標籤,這是插件Indexer.tar.gz。當用戶保存文件時,我的插件爲整個項目執行ctags,使標籤始終保持最新狀態。 – 2011-12-24 17:45:30

回答

1

方式一:

function! MyFunction() 
    "" Save all buffers. 
    bufdo wa 
    "" Run your command once. 
    ... your command ... 
endfunction 

nnoremap ,wa :call MyFunction()<CR> 

,wa在正常模式(無需冒號)和所有的緩衝區將被保存,以後它會運行命令。

編輯:修改函數返回前一個緩衝區,因爲bufdo改變它:

function! MyFunction() 
    "" Save number of current buffer. 
    let l:current_buffer = bufnr("%") 

    "" Save all buffers. 
    bufdo wa 

    "" Bufdo probably changed the buffer, so return to where we were before running previous command. 
    execute "buffer " . l:current_buffer 

    "" Run your command once. 
    ... your command ... 
endfunction 
+0

謝謝,但我正在尋找解決方案來制定標準:wa工作,以使其更易於我的插件的其他用戶使用。實際上,這是一個使用plugin cmdalias(http://goo.gl/8W6VD)並覆蓋:wa命令的變體,但它似乎太棘手。尋找更自然的方式。 – 2011-12-26 08:20:39

0

有此CursorHold事件,即觸發「當用戶沒有按下的一個關鍵時間由'updatetime'指定「(默認爲4秒)。保存文件後,該事件將在觸發updatetime毫秒後觸發,除非用戶繼續輸入。 A BufWrite自動命令可以暫時使此settimg非常低,比如說50ms,併爲CursorHold添加一個自動禁用自動命令。 BufWrite自動命令可以檢查它是否已經配置了CursorHold處理程序,以避免多次添加它。

爲了讓它有點靈活,我使這個構造觸發器自定義()事件:當檢測到第一次保存時,然後針對「保存批處理」中的每個文件,最後觸發超時。這樣我的其他腳本就可以獨立處理任何這些事件。

實現:

function! s:WriteTimeoutSchedule() 
    if !exists("#WriteTimeout#CursorHold") 
    let s:oldUpdateTime = &ut 
    set updatetime=50 
    augroup WriteTimeout 
     au CursorHold * call s:WriteTimeoutFire() 
    augroup END 
    do User WriteTimeoutPre 
    endif 
    do User WriteTimeoutEach 
endfunction 

function! s:WriteTimeoutFire() 
    do User WriteTimeoutPost 
    au! WriteTimeout 
    let &ut=s:oldUpdateTime 
endfunction 

aug WriteTimeoutSupport 
    au! 
    au BufWrite * call s:WriteTimeoutSchedule() 
aug END 

用例:toucher.vim

相關問題