UNDOがドキュメントレベルで管理されている場合は、RunningDocumentTableを使用してテーブルを列挙し、UNDOマネージャーを取得して、軌道から削除する必要があります。
class NavigateListener: IVsRunningDocTableEvents3
{
private HashSet<IVsTextView> views = new HashSet<IVsTextView>();
private IVsRunningDocumentTable table;
private uint cookie;
...
外では、この登録呼び出しを呼び出します-イベントの通知を解除する登録解除呼び出しを追加します。
public void Register()
{
table =(IVsRunningDocumentTable) Package.GetGlobalService(typeof(SVsRunningDocumentTable));
// Listen to show/hide events of docs to register activate/deactivate cursor listeners.
table.AdviseRunningDocTableEvents(this, out cookie);
}
実行中のテーブルには、保存などのイベントがたくさんありますが、ビューが登録されると聞くことができます。
public int OnAfterDocumentWindowHide(uint docCookie, IVsWindowFrame pFrame)
{
IVsTextView view = VsShellUtilities.GetTextView(pFrame);
if (view != null)
{
views.Add(view);
}
}
変更が保存されたが閉じられたドキュメントで問題が発生する可能性があります...今のところそれらを削除してください...
public int OnBeforeDocumentWindowShow(uint docCookie, int fFirstShow, IVsWindowFrame pFrame)
{
IVsTextView view = VsShellUtilities.GetTextView(pFrame);
if (view != null)
{
views.Remove(view);
}
return VSConstants.S_OK;
}
その後、スーパーアンドゥ核を行うことができます。私はこの部分をテストしていません-あなたはそれで遊ぶ必要があります。
private void NukeFromOrbit()
{
foreach( var view in views )
{
IVsTextLines buffer;
view.GetBuffer(out buffer);
IOleUndoManager manager;
buffer.GetUndoManager(out manager);
IEnumOleUndoUnits units;
manager.EnumUndoable(out units);
uint fetched=0;
var unitArray = new IOleUndoUnit[1];
while( units.Next(1, unitArray , out fetched ) == VSConstants.S_OK)
{
unitArray[0].Do(manager);
}
}
}