Unterstützung von benutzerdefinierten Dateierweiterungen im benutzerdefinierten Visual Studio-Sprachdienst

8

Ich arbeite an einem benutzerdefinierten Visual Studio-Sprachdienst und habe mehrere Fragen dazu, wie Dateierweiterungen an einen bestimmten Sprachdienst gebunden sind.

Quelldateien für die Sprache "Example Language" hat zwei primäre Dateierweiterungen: .e1 und .e2 . Meine Erweiterung hat eine Klasse ExampleLanguagePackage , die Package .

  1. Wenn Sie den Befehl Datei → Öffnen verwenden und z. B. eine C # -Datei auswählen, enthält die Schaltfläche "Öffnen" einen Dropdown-Pfeil, mit dem Sie "Öffnen mit ..." auswählen können. Wenn Sie auf diese Schaltfläche klicken, werden Ihnen Optionen zum Öffnen der Datei im "CSharp Editor (Standard)", "CSharp Editor mit Codierung" oder einer der anderen Optionen angezeigt. Wie kann ich eine ähnliche Funktion für meine Sprache bereitstellen, indem ich die Optionen "Beispielsprache (Standard)" und "Beispielsprache mit Codierung" anbiete?

  2. Wenn Sie Extras → Optionen ... → Texteditor → Dateierweiterung öffnen, können Sie beispielsweise die Erweiterung .foo an "Microsoft Visual C #" oder eine der anderen Optionen binden. Wie kann ich diese Seite so erweitern, dass benutzerdefinierte Dateierweiterungen mit der "Beispielsprache" verknüpft werden können?

  3. Was sollte ich bei der Registrierung dieser Gegenstände beachten?

Sam Harwell 07.03.2013, 05:27
quelle

1 Antwort

15

Die meisten dieser Elemente werden durch Hinzufügen einer benutzerdefinierten Implementierung von co_de% für Ihre Sprache und mit einer Kombination von Registrierungsattributen, um sie zu registrieren. Die tatsächliche Implementierung dieser Schnittstelle geht über den Rahmen dieser Frage hinaus, aber die Dokumentation für die Schnittstelle selbst (und mit dieser Seite verknüpft), zusammen mit einem Beispiel IVsEditorFactory Implementierung in den Python-Tools für Visual Studio Projekt hat mir bei meiner ersten Implementierung geholfen.

Um die Beispielsprache zu unterstützen, werde ich die folgenden Annahmen treffen.

  • Sie haben eine abstrakte Klasse DjangoEditorFactory implementiert, die die Kernimplementierung von ExampleEditorFactory bereitstellt. Die Klasse sollte einen geschützten Konstruktor mit dem Argument IVsEditorFactory haben, um anzugeben, ob die Factory den Benutzer zur Codierung auffordert (ähnlich einem der Konstruktoren von bool ).
    • Sie haben eine Klasse DjangoEditorFactory , die ExampleEditorFactoryWithoutEncoding erweitert und die Basisklasse erstellt, die ExampleEditorFactory für das Argument false angibt. Diese Klasse sollte mit dem Attribut promptForEncoding gekennzeichnet sein.
    • Sie haben eine Klasse [Guid] , die ExampleEditorFactoryWithEncoding erweitert und die Basisklasse mit ExampleEditorFactory für das Argument true erstellt. Diese Klasse sollte mit dem Attribut promptForEncoding gekennzeichnet sein.
  • Sie haben Ihrer VSPackage.resx-Ressourcendatei die folgenden Einträge hinzugefügt. Die Konstanten können geändert werden, aber beachten Sie, dass ich die konstanten Werte 101 und 102 unten verwendet habe.
    • 101 = Beispielsprache

    • 102 = Beispielsprache mit Codierung

Registrierung der Editorfactories

Als erstes müssen Sie Ihre Editorfactories registrieren. Dies geschieht in zwei Teilen.

Verwenden Sie zuerst die [Guid] . Dieses Attribut verknüpft eine Ressourcen-ID für den Anzeigenamen der Factory mit dem Factory-Typ selbst.

%Vor%

Als Nächstes in der ProvideEditorFactoryAttribute Methode von Initialize , Aufrufe zu ExampleLanguagePackage nachdem Sie RegisterEditorFactory aufgerufen haben.

%Vor%

Verknüpfen Sie eine logische Sicht mit den Editorfactorys

Ich habe nicht alle Informationen gefunden, die ich über die Anwendungsfälle für das base.Initialize() Attribut, aber es ist wichtig, mindestens Folgendes zu berücksichtigen. Stellen Sie sicher, dass die logischen Ansichten mit den beiden von Ihnen erstellten Factorys registriert sind.

%Vor%

Wenn dieser Schritt nicht ausgeführt wird, funktioniert die Funktion, bei der Sie im Ausgabefenster auf eine Codezeile doppelklicken können, nicht wie erwartet. Angenommen, das Ausgabefenster enthält eine Zeile wie die folgende.

%Vor%

Durch die Zuordnung der logischen TextView-Ansicht kann die IDE Ihre Factory verwenden, wenn Sie auf diese Ausgabezeile doppelklicken, um zu Zeile 14, Spalte 3 der Datei c: \ dev \ file.e1 zu gelangen. Andernfalls wird eine andere Factory verwendet, um eine neue Kopie Ihres Dokuments zu öffnen, und im neuen Fenster werden wahrscheinlich viele Funktionen fehlen.

Ordnen Sie den Editor-Factories

die Standard-Dateierweiterungen ProvideEditorLogicalViewAttribute und .e1 zu

Dieser Schritt stellt die Unterstützung von "Öffnen mit ..." für die in der ursprünglichen Frage 1 beschriebenen .e1- und .e2-Dateien bereit. Dieser Schritt wird mit dem .e2 Attribut.

Die Standardpriorität für die primäre Fabrik scheint 50 zu sein. Die Fabrik mit expliziter Kodierung sollte eine niedrigere Priorität haben, und 49 scheint eine gute Wahl zu sein. Beachten Sie, dass der Parameter ProvideEditorExtensionAttribute named nicht angegeben werden muss, da er bereits in der obigen% code_% -Verwendung angegeben wurde (die generierten Registrierungsschlüssel sind identisch).

%Vor%

Ordnen Sie die Erweiterung NameResourceID den Editorfactorys

zu

Dieser Schritt bietet die "Öffnen mit ..." - Unterstützung für alle anderen Dateien und fügt Unterstützung für die Dateierweiterungsoptionen hinzu, die in der ursprünglichen Frage 2 beschrieben wurden. Dieser Schritt verwendet auch das ProvideEditorFactoryAttribute -Attribut, verwendet aber viel weniger Prioritätswert, um sicherzustellen, dass die Standardeditoren für andere Dateitypen nicht von der Einstellung überschrieben werden.Wie im vorherigen Schritt wird der Fabrik mit expliziter Codierung eine niedrigere Priorität zugewiesen.

%Vor%

Schlussnotizen

Diese Antwort deckt nicht mehrere Details ab.

Sam Harwell 07.03.2013, 05:27
quelle