【发布时间】:2012-09-26 08:34:51
【问题描述】:
我有一个在BufWritePre 上调用的 Vimscript 函数来检查文件的完整性。通常这涉及修剪空白并检查折叠结构是否“有效”(根据我公司的惯例)。
我的问题是,如果我编辑一个文件然后保存它,撤消树包含检查功能所做的编辑。有没有一种简单的方法可以说我不想要一个函数来修改撤消树?或者我可以在函数开始时保存它的状态并在结束时恢复它?
【问题讨论】:
我有一个在BufWritePre 上调用的 Vimscript 函数来检查文件的完整性。通常这涉及修剪空白并检查折叠结构是否“有效”(根据我公司的惯例)。
我的问题是,如果我编辑一个文件然后保存它,撤消树包含检查功能所做的编辑。有没有一种简单的方法可以说我不想要一个函数来修改撤消树?或者我可以在函数开始时保存它的状态并在结束时恢复它?
【问题讨论】:
使用:undojoin,您可以将您的更改与用户所做的最后更改结合起来(尽管我发现这比将它们分开更令人困惑)。一般来说,撤消是一系列步骤;您不能简单地省略中间的步骤,这既不直观,也难以在撤消引擎中实现。
无论如何,在撤消历史记录中包含自动重新格式化有什么不好?据我了解,当用户撤消上一次编辑时,它将在下次保存时重新应用。
【讨论】:
undojoin 命令可能会派上用场。
如果您的 BufWritePre 操作正在执行最终使您的文件保持不变的操作,您可以:
:wundo <tmpfile>
...之后进行更改,使文件保持不变...
:rundo <tmpfile>
这将为您留下临时更改之前的撤消历史记录,但是如果文件与之前的状态不匹配,您将收到错误 File contents changed, cannot use undo info。
如果您希望在BufWritePre 期间完成的更改无法撤消,您可以:
:set noundofile
.. 执行更改 ...
:set undofile
但是,这将丢失 BufWritePre 之前的所有历史记录
【讨论】:
BufWritePre 操作之前撤消更改吗?
u 应该删除该单词,而不管保存触发的任何空白更改。
wundo/rundo 解决方案似乎适用于我刚刚尝试过的简单情况。感谢您的帮助。