6 Stimmen

Erstellen einer einfachen Visual Studio 2010-Erweiterung zur Textmanipulation

Ich wollte schon seit einiger Zeit eine einfache Textmanipulationserweiterung für Visual Studio erstellen, und jetzt habe ich endlich etwas Zeit gefunden, um mich damit zu beschäftigen, wie Erweiterungen geschrieben werden. Was ich im Sinn habe, könnte durch VBA-Makros erreicht werden, aber ich würde es lieber als "echte" Erweiterung implementieren; als Lernprozess, und weil ich ehrlich gesagt nicht VBA stehen kann.

Nach einem fairen Betrag von googeln, Blog lesen, graben in MSDN und StackOverflow Beiträge durchsuchen, ich denke, ich habe genug Informationen gesammelt, dass ich es implementieren kann - aber ich möchte einige Rückmeldungen, ob ich die Dinge richtig angehen, bevor ich beginnen, hacken weg :)

Was ich möchte, ist:

  1. Registrierung von Befehlen, an die Benutzer über Werkzeuge->Optionen->Tastatur Hotkeys binden können.
  2. Ändern Sie den Textpuffer des aktiven Fensters, wenn Befehle aufgerufen werden.
  3. Ich kümmere mich nicht wirklich um Menüs oder Symbolleisten, aber ich weiß, wie ich sie über .vsct-Dateien hinzufügen kann (gibt es bessere Optionen?)

Für #1 muss ich anscheinend ein komplettes VSPackage, eine .vsct-Datei usw. erstellen - gibt es keinen netten und einfachen MEF-Erweiterungspunkt, den ich stattdessen verwenden kann? (Vielleicht das Exportieren einer IWpfTextViewCreationListener und mit der manuellen Handhabung von Tastenkombinationen herumfummeln - aber das wäre ein großer Hack).

Zu #2: Ich bin mir nicht sicher, wie ich eine ITextBuffer für das aktive Dokument. Ich könnte durchgehen DTE.ActiveDocument aber ich bin nicht sicher, wie ich eine ITextBuffer davon. Alternativ könnte ich auch etwas in der Art von...

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

...aber das sieht wirklich nach einem Umweg aus, um die Dinge zu erledigen?

9voto

Noah Richards Punkte 6727

In beiden Fällen sollten Sie sich die Zuordnungen ausrichten Erweiterungsquelle . Es handelt sich um eine Paket/MEF-Komponente, die einen Befehl hinzufügt und ihn im aktiven Fenster verarbeitet.

Ihre Antwort auf Frage 1 ist richtig. Die beste Möglichkeit, Befehle auszuführen, ist eine .vsct-Datei, die ein Paket erfordert. Ein Package bedeutet jedoch nur, 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 in Ihrem Package angeben. Das ist (hoffentlich) nicht zu viel Overhead.

Für Ihre zweite Frage gibt es einen saubereren Weg. Werfen Sie einen Blick auf die Befehlsfilter die auf Befehle in der aktiven Ansicht wartet, anstatt global auf sie zu warten und dann die aktive Ansicht zu finden. Sie überlässt der Shell die Weiterleitung der Befehle und konzentriert sich nur auf die Implementierung.

0voto

Kate Gregory Punkte 18638

Nicht ganz sicher, was Sie mit "der Textpuffer" meinen, aber angenommen, Sie meinen entweder die aktuelle Textdatei, die geöffnet ist, oder die aktuelle Auswahl, hier ist etwas Code, den ich in einem Paket habe, um diese zugreifen:

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
   }
}

Bei einer Editor-Erweiterung wäre das natürlich etwas anderes.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X