我正在尝试在写入磁盘时修改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似乎表明只需要一个简单的“撤销”就可以了。但那对我不起作用。任何提示都赞赏。
答案 0 :(得分:1)
我终于自己撤消了这个bug。不知何故,有两个条目进入BufWritePre和BufWritePost,所以两个都被调用两次,第二个撤消撤消了额外的时间。我仍然不确定这是怎么回事,但使用au!在发出自动命令之前清除自动命令会导致只记录一组au命令。我也不确定为什么即使有两套也有出现问题,因为我确保每次调用BufWritePre时至少进行了一次更改。无论如何,现在似乎工作正常。