【问题标题】:Prevent Vim from updating its undo tree阻止 Vim 更新它的撤销树
【发布时间】:2012-09-26 08:34:51
【问题描述】:

我有一个在BufWritePre 上调用的 Vimscript 函数来检查文件的完整性。通常这涉及修剪空白并检查折叠结构是否“有效”(根据我公司的惯例)。

我的问题是,如果我编辑一个文件然后保存它,撤消树包含检查功能所做的编辑。有没有一种简单的方法可以说我不想要一个函数来修改撤消树?或者我可以在函数开始时保存它的状态并在结束时恢复它?

【问题讨论】:

    标签: vim undo


    【解决方案1】:

    使用:undojoin,您可以将您的更改与用户所做的最后更改结合起来(尽管我发现这比将它们分开更令人困惑)。一般来说,撤消是一系列步骤;您不能简单地省略中间的步骤,这既不直观,也难以在撤消引擎中实现。

    无论如何,在撤消历史记录中包含自动重新格式化有什么不好?据我了解,当用户撤消上一次编辑时,它将在下次保存时重新应用。

    【讨论】:

    • 谢谢,你提出了一些好观点。我需要重新考虑我想要达到的目标。 undojoin 命令可能会派上用场。
    【解决方案2】:

    如果您的 BufWritePre 操作正在执行最终使您的文件保持不变的操作,您可以:

    :wundo <tmpfile>
    

    ...之后进行更改,使文件保持不变...

    :rundo <tmpfile>
    

    这将为您留下临时更改之前的撤消历史记录,但是如果文件与之前的状态不匹配,您将收到错误 File contents changed, cannot use undo info

    如果您希望在BufWritePre 期间完成的更改无法撤消,您可以:

    :set noundofile
    

    .. 执行更改 ...

    :set undofile
    

    但是,这将丢失 BufWritePre 之前的所有历史记录

    【讨论】:

    • 这看起来很棒,谢谢。为什么这仅在文件未更改时才有效?通常文件会更改,但我不希望能够撤消更改。
    • @PrinceGoulash 您希望能够在BufWritePre 操作之前撤消更改吗?
    • 是的。因此,如果我添加一个单词然后保存,u 应该删除该单词,而不管保存触发的任何空白更改。
    • @PrinceGoulash 据我所知,这是不可能的,撤消文件格式基于一系列差异,因此其中不能缺少信息,否则将无法重现中间状态。
    • 我认为可能是这样。但是,您的 wundo/rundo 解决方案似乎适用于我刚刚尝试过的简单情况。感谢您的帮助。
    猜你喜欢
    • 2010-11-08
    • 2018-12-07
    • 1970-01-01
    • 2011-08-07
    • 2019-08-03
    • 2013-04-19
    • 2019-04-12
    • 2021-09-24
    • 2021-07-03
    相关资源
    最近更新 更多