【发布时间】:2011-05-15 11:19:05
【问题描述】:
我试图在写入磁盘时修改 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 来说,似乎只需要一个简单的“撤消”即可。但这对我不起作用。任何提示表示赞赏。
【问题讨论】:
标签: vim