在Visual Studio扩展中记录撤消/重做操作

本文关键字:撤消 重做 操作 记录 Visual Studio 扩展 | 更新日期: 2023-09-27 18:24:57

我编写了一个Visual Studio扩展,并让它保留与我的扩展相关的用户操作的日志。我希望能够在日志中包含我的工具所做的更改的撤消/重做信息,我希望能够通过在发生撤消/重做时调用事件侦听器并检查撤消/重做对象是否与我的工具生成的操作相对应

的对象来实现。

目前,我有代码来获取当前IWpfTextViewITextUndoHistory,我使用按照此答案生成的ITextUndoHistoryRegistry获得该。不幸的是,我得到的ITextUndoHistory对象没有实现足够的功能而变得有用。具体来说,它的UndoRedoHappened事件被调用,但始终具有null事务。此外,它的UndoStack/RedoStack属性抛出System.NotSupportedException。唯一有效的是CreateTransaction确实给了我一个事务对象,并让我设置Visual Studio的撤消/重做列表中显示的操作的名称,尽管我不需要它来工作。

是否有其他方法可以访问Visual Studio中的撤消信息?或者也许是一些更有创意的黑客,我可以访问什么?

在Visual Studio扩展中记录撤消/重做操作

我假设您想记录编辑器扩展命令的撤消/编辑。如果不是这样的话...下面的描述将没有用。:-)

您首先要做的是创建一个派生自 ITextUndoPrimitive 的小类,该类表示包含在撤消事务的一部分中的小型"操作"。这有两个重要方法:Undo()用户撤消事务时调用,Do()用户撤消事务然后按 Redo 时调用。对于其余的方法,只需执行简单的实现:CanUndo/CanRedo应始终返回 true,并使 Parent 成为简单的读/写属性。 CanMerge应始终返回 false,您可以不Merge()实现。当然,您可以在 ITextUndoPrimitive 中保存您想要的任何其他状态。

至于你在"执行/撤消"中执行的操作,这取决于您。因此,如果您的扩展正在修改文本缓冲区并写入用户项目中的其他某个文件,则可以撤消文件写入。我感觉您只是在尝试跟踪用户撤消了哪些操作(也许出于统计目的?(,因此您可能只是更新日志中的"用户撤消了此操作"位并完成它。

执行操作时,调用 CreateTransaction 以启动新事务,然后在该事务上调用 AddUndo(( 传入撤消原语的新实例。然后,编辑器将根据需要调用"执行/撤消"。

最后一点:当事务历史记录太长时,或者在某些情况下历史记录被销毁并且必须重置时,编辑器将自动删除撤消事务。因此,预计在某个时候您的撤消原语将消失并被 GC'ed。最重要的是:不要在其他地方抓住它们,以免它们泄漏。