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.
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. –