2010-11-03 7 views
6

Ich wollte für eine Weile eine einfache Text-Bearbeitungserweiterung für Visual Studio erstellen, und jetzt habe ich endlich etwas Zeit gefunden, um zu sehen, wie Erweiterungen geschrieben werden. Was ich vorhabe, könnte durch VBA-Makros erreicht werden, aber ich würde es eher als "echte" Erweiterung implementieren; als Lernprozess, und weil ich VBA ehrlich nicht ausstehen kann.Erstellen einer einfachen Text-Bearbeitung von Visual Studio 2010-Erweiterung

Nach einer ordentlichen Portion Googeln, Blog lesen, in MSDN suchen und StackOverflow Posts durchsuchen, denke ich, dass ich genug Informationen gesammelt habe, die ich implementieren kann - aber ich hätte gerne ein Feedback darüber, ob ich mich den Dingen annähere kurz bevor ich weg :)

Hacking starten Was ich möchte, ist:

  1. Befehle Registrierung, die Benutzer Hotkeys über Extras-> Optionen-> Tastatur binden können.
  2. Ändern Sie den Textpuffer des aktiven Fensters, wenn Befehle aufgerufen werden.
  3. Ich weiß nicht wirklich über Menüs oder Symbolleisten, aber wissen, wie es über .vsct Dateien hinzufügen (gibt es bessere Möglichkeiten?)

Für # 1, es scheint, ich habe eine volle VSPackage zu tun , .vsct-Datei und so weiter - es gibt keinen schönen und einfachen MEF-Erweiterungspunkt, mit dem ich umgehen kann? (Vielleicht ein IWpfTextViewCreationListener exportieren und herumspielen mit manuellen Tastaturkürzel Handhabung - aber das wäre ein wichtiger Hack).

Für # 2, bin ich mir nicht sicher, wie Sie eine ITextBuffer für das aktive Dokument erhalten. Ich könnte durch DTE.ActiveDocument gehen, aber ich bin mir nicht sicher, wie man eine ITextBuffer davon erhält. Alternativ könnte ich etwas in Richtung der ...

var txtMgr = (IVsTextManager)ServiceProvider.GetService(typeof(SVsTextManager)); 
IVsTextView textViewCurrent; 
txtMgr.GetActiveView(true, null, out textView); 
IWpfTextView wpfViewCurrent = AdaptersFactory.GetWpfTextView(textView); 
ITextBuffer textCurrent = wpfViewCurrent.TextBuffer; 

... tun, aber das sieht sicher aus wie ein Umweg, Dinge zu tun?

Antwort

9

Für beide, werfen Sie einen Blick auf die Align Assignments extension source. Es ist eine Paket-/MEF-Komponente, die einen Befehl hinzufügt und im aktiven Fenster verarbeitet.

Ihre Antwort auf # 1 ist korrekt. Die beste Möglichkeit, Befehle auszuführen, ist eine .vsct-Datei, die ein Paket erfordert. Ein Paket bedeutet jedoch, dass Ihr Projekt eine DLL mit eingebetteten Ressourcen (aus der .vsct-Datei) und eine .pkgdef-Datei erzeugt, die Registrierungsschlüssel entsprechend den Attributen hinzufügt, die Sie auf Ihrem Paket bereitstellen. Es ist (hoffentlich) nicht zu viel Aufwand.

Für Ihre zweite Frage gibt es einen saubereren Weg. Werfen Sie einen Blick auf die command filter, die auf Befehle in der aktiven Ansicht wartet, statt sie global zu überwachen und dann die aktive Ansicht zu finden. Dadurch kann die Shell das Befehlsrouting handhaben und konzentriert sich nur auf die Implementierung.

+0

Danke! Es gibt etwas über das Hinzufügen eines Filters zu jedem VsTextView, das mich ein bisschen ärgert, aber die Lösung * ist * definitiv besser.Schade, man muss sich immer noch mit hässlichem com/ole Vermächtnis auseinandersetzen, aber zumindest ist es minimal und kann abstrahiert werden :) – snemarch

0

Nicht ganz sicher, was Sie unter „Textpuffer“ bedeuten, aber vorausgesetzt, Sie bedeuten entweder die aktuelle Textdatei, die geöffnet oder die aktuelle Auswahl ist, hier einige Code, den ich in einem Paket haben diejenigen zuzugreifen:

EnvDTE.DTE app = (EnvDTE.DTE)GetService(typeof(SDTE)); 
if (app.ActiveDocument != null && app.ActiveDocument.Type == "Text") 
{ 
    EnvDTE.TextDocument text = (EnvDTE.TextDocument)app.ActiveDocument.Object(String.Empty); 
    if (!text.Selection.IsEmpty) 
    { 
     //work with text.Selection.Text 
    } 
} 

Natürlich, wenn Sie eine Editor-Erweiterung machen, wäre es anders.

+0

Ich meine, den ITextBuffer für das aktuelle/aktive Dokument zu bekommen - das ist die neue Art, mit den Textbearbeitungsdiensten zu interagieren, anstatt der begrenzteren DTE/Selection-Methoden. – snemarch