【问题标题】:undo problem with bufwritepre, bufwritepost events in VimVim 中的 bufwritepre、bufwritepost 事件的撤消问题
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2013-07-29
      • 1970-01-01
      • 2018-05-15
      • 2010-12-06
      • 2017-12-10
      • 1970-01-01
      • 2011-06-06
      • 1970-01-01
      • 2013-07-31
      相关资源
      最近更新 更多