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
.
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?
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?
Was sollte ich bei der Registrierung dieser Gegenstände beachten?
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.
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
).
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. [Guid]
, die ExampleEditorFactoryWithEncoding
erweitert und die Basisklasse mit ExampleEditorFactory
für das Argument true
erstellt. Diese Klasse sollte mit dem Attribut promptForEncoding
gekennzeichnet sein. 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.
Als Nächstes in der ProvideEditorFactoryAttribute
Methode von Initialize
, Aufrufe zu ExampleLanguagePackage
nachdem Sie RegisterEditorFactory
aufgerufen haben.
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.
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.
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).
NameResourceID
den Editorfactorys 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.
Diese Antwort deckt nicht mehrere Details ab.
.*
. ProvideEditorExtensionAttribute
unterstützt nicht die Angabe des Wertes ProvideEditorFactoryAttribute.CommonPhysicalViewAttributes
(Suche auf der Seite). Dieser Wert würde normalerweise zur Registrierung von ProvideEditorFactoryAttribute
hinzugefügt, und der Wert wäre die GUID von LinkedEditorGUID
. Tags und Links visual-studio vsx languageservice