防止Vim更新其撤销树

9
我有一个 Vimscript 函数,在 BufWritePre 时被调用,以检查文件的完整性。通常,这涉及修剪空格并检查折叠结构是否“有效”(根据我的公司的约定)。
我的问题是,如果我编辑一个文件然后保存它,撤销树将包含由检查函数进行的编辑。有没有一种简单的方法表明我不希望函数修改撤销树?或者我可以在函数开始时保存其状态并在结束时恢复状态?
2个回答

6
使用 ":undojoin" 命令,您可以将您的更改与上一个用户完成的更改合并(尽管我认为这比将它们分开更加混乱)。总的来说,撤消是一系列步骤; 您不能简单地省略中间的步骤,那样既不直观,而且在撤消引擎中实现起来也很困难。
无论如何,将您的自动重新格式化包含在撤消历史记录中有什么不好呢?就我所知,当用户撤消他最后的编辑时,它将在下一次保存时重新应用。

谢谢,你提出了一些好的观点。我需要重新考虑我想要实现什么。undojoin 命令可能会很有用。 - Prince Goulash

3
如果你的BufWritePre操作执行的操作最终并未更改文件,你可以采取以下措施:
:wundo <tmpfile>

在不改变文件的情况下进行更改...

:rundo <tmpfile>

这将使你保留暂时更改之前的撤销历史记录,但是如果文件与其先前状态不匹配,则会出现错误文件内容已更改,无法使用撤消信息

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

:set noundofile

执行更改...

:set undofile

然而,这将失去在BufWritePre之前的所有历史记录。

这看起来很不错,谢谢。为什么只有在文件未更改时才能起作用?一般情况下,文件会发生变化,但我不想撤销更改。 - Prince Goulash
@PrinceGoulash 你想在 BufWritePre 操作之前撤销更改吗? - Benj
是的。所以如果我添加一个单词然后保存,u 应该删除这个单词,而不管保存时触发了任何空格变化。 - Prince Goulash
据我所知,这是不可能的。撤销文件格式基于一系列差异,因此不能在其中缺少信息,否则它将无法重现中间状态。@PrinceGoulash - Benj
我认为这可能是情况。然而,你的wundo/rundo解决方案似乎在我刚刚尝试的简单情况下有效。感谢你的有用回答。 - Prince Goulash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接