Visual studio 2010 Visual Studio软件包/宏:如何将多个文本操作组合到单个撤消中

Visual studio 2010 Visual Studio软件包/宏:如何将多个文本操作组合到单个撤消中,visual-studio-2010,vs-extensibility,Visual Studio 2010,Vs Extensibility,我有一个Visual Studio 2010软件包,它结合了多种文本操作,例如,它将自定义属性插入到我的csharp文件中 这些插入可以变得相当多,我希望能够通过单击“撤消”按钮来反转命令的效果。有办法吗?有。假设你有一个有效的 ITextBuffer buffer; 您只需要获得一个ITextEdit,如下所示: var textEdit = buffer.CreateEdit(); 然后你可以: textEdit.Delete(...) textEdit.Insert(....) 当你

我有一个Visual Studio 2010软件包,它结合了多种文本操作,例如,它将自定义属性插入到我的csharp文件中


这些插入可以变得相当多,我希望能够通过单击“撤消”按钮来反转命令的效果。有办法吗?

有。假设你有一个有效的

ITextBuffer buffer;
您只需要获得一个ITextEdit,如下所示:

var textEdit = buffer.CreateEdit();
然后你可以:

textEdit.Delete(...)
textEdit.Insert(....)
当你完成时,你必须

textEdit.Apply();

如果不应用或取消更改,缓冲区上将不允许进行其他更改。。。。因此,您可能希望在一次尝试中包装您的更改…最后,这样一个异常不会关闭您的编辑器。您的所有更改都将被分组,一次撤消将使它们全部反转


希望这有帮助。

ITextEdit是一次性的,所以您应该将它放在using块中。如果未调用Apply而离开using块,则它将自动取消。因此,它看起来像:使用var textEdit=buffer.CreateEdit{//doStuff,然后使用textEdit.Apply;}此外,如果您同时在多个文件中进行编辑,这种方法将无法完全解决问题。如果您正在这样做,您将需要手动创建一个撤销事务,如果您可以澄清问题,这将help@Noah-太酷了。。。还有一个很好的摆脱尝试的方法…终于。谢谢有可能创建一个覆盖多个文件的撤消。。。听起来像是我未来的博客帖子!您是针对IVsTextBuffer之类的接口还是针对ITextBuffer之类的接口进行编辑?答案是肯定的,但具体取决于你拥有什么。另外,您是否也在尝试跨文件执行单个撤消事务?
textEdit.Cancel();