0

Ich möchte einen benutzerdefinierten Editor haben, der mit den neueren MEF-Sprachdiensten interagiert (z. B. IVsTextViewCreationListener, usw.).Benutzerdefinierter Editor mit Intellisense [Visual Studio]

Ich bin für eine benutzerdefinierte Sprache eine Visual Studio-Erweiterung zu schreiben. Ich habe Intellisense, Syntax Highlighting und Code Completion für eine bestimmte Dateierweiterung arbeiten, aber es gibt keine einzige Erweiterung für diese Sprache. Daher möchte ich, dass diese Funktionen mit jeder Dateierweiterung funktionieren. Ich habe auch einen benutzerdefinierten Editor von IVsEditorFactory abgeleitet, so dass ich jede Datei mit 'Öffnen mit ...' öffnen kann.

In IVsEditorFactory.CreateEditorInstance verwende ich die IVsEditorAdaptersFactoryService, um eine IVsTextBuffer und IVsCodeWindow zu erstellen. Das alles funktioniert gut und ich kann Dateien im Editor öffnen, aber ich kann nicht herausfinden, wie die MEF Komponenten Intellisense gelten hat, sytnax Hervorhebung, usw. an dem benutzerdefinierten Editor.

Eines habe ich versucht ...

public int CreateEditorInstance(uint createFlags, string documentMoniker, string physicalView, 
    IVsHierarchy hierarchy, 
    uint itemId, IntPtr docDataExisting, out IntPtr docView, out IntPtr docData, 
    out string editorCaption, out Guid guidCommand, out int createWindowFlags) 
{ 
    IComponentModel model = _package.GetGlobalService<SComponentModel>() as IComponentModel; 
    IVsEditorAdaptersFactoryService adapterService = model.GetService<IVsEditorAdaptersFactoryService>(); 
    ITextBufferFactoryServicebufferFactory bufferFactory = model.GetService<ITextBufferFactoryService>(); 
    ITextEditorFactoryServiceeditorFactory editorFactory = model.GetService<ITextEditorFactoryService>(); 
    IContentTypeRegistryServicetypeRegistry typeRegistry = model.GetService<IContentTypeRegistryService>(); 
    IContentType contentType = typeRegistry.GetContentType("ContentType"); 
    ITextBuffer buffer = bufferFactory.CreateTextBuffer(contentType); 
    IWpfTextView view = editorFactory.CreateTextView(buffer); 

    IVsCodeWindow window = adapterService.CreateVsCodeWindowAdapter(_serviceProvider); 

    // Throws exception when trying to open the editor 
    // "Could not find adapter for the given buffer" 
    IVsTextLines lines = adapterService.GetBufferAdapter(buffer) as IVsTextLines; 
    window.SetBuffer(lines); 
    docView = Marshal.GetIUnknownForObject(window); 
    docData = Marshal.GetIUnknownForObject(lines); 
    guidCommand = VSConstants.GUID_TextEditorFactory; 
    return VSConstants.S_OK; 
} 

Im Debugger kann ich sehen, dass meine MEF-Komponenten werden nun den neuen Puffer und Blick zu erkennen. Allerdings scheint es, dass es keine Möglichkeit gibt, ein ITextBuffer in IVsTextLines zu konvertieren.

Antwort

0

Basierend auf Ihrer Beschreibung, scheint es, dass Sie eine benutzerdefinierte Sprache erstellen möchten, die Intellisense unterstützen müssen, Syntax-Hervorhebung und Code-Vervollständigung für eine bestimmte Dateierweiterung arbeiten. Der folgende Link enthält ein Beispiel für die Unterstützung von Intellisense, Syntaxfärbung, Code-Vervollständigung, Code-Snippets, benutzerdefinierte Projekttypen und MSBuild-Integration.

https://code.msdn.microsoft.com/IPyIntegration

Ich kann meine MEF Komponenten sehen, dass jetzt die neuen Puffer und Blick erkennen, aber ich weiß nicht, wie diese in eine IVsCodeWindow zu setzen.

aus dem Code, es die folgende Methode verwendet:

private IntPtr CreateCodeView(IVsTextLines textLines, ref string editorCaption, ref Guid cmdUI) 
     { 
      Type codeWindowType = typeof(IVsCodeWindow); 
      Guid riid = codeWindowType.GUID; 
      Guid clsid = typeof(VsCodeWindowClass).GUID; 
      IVsCodeWindow window = (IVsCodeWindow)package.CreateInstance(ref clsid, ref riid, codeWindowType); 
      ErrorHandler.ThrowOnFailure(window.SetBuffer(textLines)); 
      ErrorHandler.ThrowOnFailure(window.SetBaseEditorCaption(null)); 
      ErrorHandler.ThrowOnFailure(window.GetEditorCaption(READONLYSTATUS.ROSTATUS_Unknown, out editorCaption)); 
      cmdUI = VSConstants.GUID_TextEditorFactory; 
      return Marshal.GetIUnknownForObject(window); 
     } 
+0

das Problem ist eigentlich, dass ich jede Erweiterung unterstützen wollen. Ich habe versucht Code ähnlich dieser 'CreateCodeView' Methode, aber es scheint nicht zu arbeiten, um Puffer, die mit dem' ITextBufferFactoryService' erstellt werden. Ich werde die Frage mit weiteren Details aktualisieren. –

Verwandte Themen