2010-11-25 88 views
1

我試圖在寫入磁盤時修改BufWritePre中的文件, ,然後在BufWritePost中取消這些修改,因此 工作緩衝區中的文本保持不變。問題在於,在BufWritePre中完成的操作之前,撤消操作似乎總是撤銷上次撤銷操作 ,以及在BufWritePre中完成的更改 。undo bufwritepre問題,Vim中的bufwritepost事件

下面是代碼:

" BufWritePre function 
function! <SID>GlobalUnconvertTags() 
    let g:save_cursor = getpos(".") 
    g/^\*\+\s/call UnconvertTags(line(".")) 
endfunction 
" BufWritePost function 
function! <SID>UndoUnconvertTags() 
    undo 
    call setpos(".",g:save_cursor) 
endfunction 

是否需要的東西,從一個簡單的撤銷有什麼不同?給出這兩個 函數,因爲它們是,如果我不斷髮出命令':w' 我的緩衝區的undostate將逐步遞增,每次發出w命令時都會返回一個undo 。

要以另一種方式解釋問題,當我持續發出:w命令時,在緩衝區中看到的內容與我在發出:undo命令時看到的內容完全相同。寫入時確實在BufWritePre函數中進行了更改,但撤消時,它們總是撤消BufWritePre更改,再加上一次撤消將向後移動實際緩衝區狀態。

我試着改變職能,明確全球化志願服務青年撤消 狀態(如下圖),但是這不工作之一:

" BufWritePre function 
function! <SID>GlobalUnconvertTags() 
    let g:save_cursor = getpos(".") 
    let s:undostate = changenr() 
    g/^\*\+\s/call UnconvertTags(line(".")) 
endfunction 
" BufWritePost function 
function! <SID>UndoUnconvertTags() 
    execute "undo ".s:undostate 
    call setpos(".",g:save_cursor) 
endfunction 

我想我錯過的是如何撤消應該簡單的東西在這兩個事件之間工作 ,但我無法弄清楚什麼。 BufWritePost的文檔 似乎表明一個簡單的「撤消」將是所有需要的。但是這對我不起作用。任何提示讚賞。

回答

1

我終於自己解決了這個bug。不知何故,BufWritePre和BufWritePost都有兩個輸入項,所以兩個都被調用了兩次,第二次撤消則撤消了額外的時間。我仍然不確定這是怎麼發生的,但使用au!在發佈它們之前清除自動命令會導致只記錄一組au命令。我也不確定爲什麼即使有兩組,也有一個undos的問題,因爲我確保每次調用BufWritePre時至少發生一次更改。無論如何,它現在似乎工作正常。