解决vf中的bufwritepre,bufwritepost事件的问题

时间:2010-11-25 02:44:33

标签: vim

我正在尝试在写入磁盘时修改BufWritePre中的文件, 然后在BufWritePost中撤消这些修改 工作缓冲区中的文本保持不变。问题是 撤消操作似乎总是撤消上一次撤消操作 在BufWritePre中完成之前,以及更改 在BufWritePre中完成。

以下是代码:

" 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命令。

以另一种方式解释问题,当我不断发出: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 个答案:

答案 0 :(得分:1)

我终于自己撤消了这个bug。不知何故,有两个条目进入BufWritePre和BufWritePost,所以两个都被调用两次,第二个撤消撤消了额外的时间。我仍然不确定这是怎么回事,但使用au!在发出自动命令之前清除自动命令会导致只记录一组au命令。我也不确定为什么即使有两套也有出现问题,因为我确保每次调用BufWritePre时至少进行了一次更改。无论如何,现在似乎工作正常。

相关问题