Agregar el Resaltado de Sintaxis para IElisonBuffer
-
02-01-2020 - |
Pregunta
Estoy trabajando en un proyecto en el que hemos dividido código de C# en funciones y se almacenan estas funciones dentro de IElisonBuffers.Tengo Intellisense conectado, y los búferes de interactuar con otras extensiones finas como se muestra a continuación:
Sin embargo, no puedo conseguir el resaltado de sintaxis para trabajar dentro de estos editores.
Puedo incluir a estos editores a través de los siguientes pasos:
- Crear un
IVsInvisibleEditor
para el archivo. - Obtener la
IVsTextLines
para esteIVsInvisibleEditor
- Crear un
IVsCodeWindow
y establecer el búfer para esteIVsCodeWindow
para ser elIVsTextLines
a partir de laIVsInvisibleEditor
- Obtener un
IWpfTextViewHost
desde esta ventana de código.Esto me lleva de vuelta a la "WPF Tierra" de donde soy capaz de interactuar con la tradicional abarca. - Crear un SnapshotSpan de la
IWpfTextViewHost
's vista de texto.Este SnapshotSpan contiene una sola función. - Crear un
IElisionBuffer
contiene el SnapshotSpan. - Crear un
IVsTextBuffer
a través deIVsEditorAdaptersFactoryService.CreateVsTextBufferAdapterForSecondaryBuffer()
que pasa en elIElisionBuffer
. - Ahora echo la
IVsTextBuffer
aIVsTextLines
y llame aSetLanguageServiceID()
que pasa en el C# GUID:694DD9B6-B865-4C5B-AD85-86356E9C88DC. - Yo verifique que se ha establecido correctamente a través de
GetLanguageServiceID()
y todo se ve bien. - Puedo crear una
IVsTextView
y se inicializa con el nuevoIVsTextBuffer
. - Yo, a continuación, obtener la
IWpfTextViewHost
para esteIVsTextView
.
Hay medidas especiales que deben tenerse cuidado de que la configuración del idioma de IDENTIFICACIÓN de servicio para un IElisionBuffer?
En aras de la exhaustividad este es el código que estoy usando:
public CustomEditorViewModel CreateEditor(string filePath, int start, int end) {
IVsInvisibleEditor invisibleEditor;
ErrorHandler.ThrowOnFailure(this._InvisibleEditorManager.RegisterInvisibleEditor(
filePath
, pProject: null
, dwFlags: (uint)_EDITORREGFLAGS.RIEF_ENABLECACHING
, pFactory: null
, ppEditor: out invisibleEditor));
var docDataPointer = IntPtr.Zero;
Guid guidIVsTextLines = typeof(IVsTextLines).GUID;
ErrorHandler.ThrowOnFailure(
invisibleEditor.GetDocData(
fEnsureWritable: 1
, riid: ref guidIVsTextLines
, ppDocData: out docDataPointer));
IVsTextLines docData = (IVsTextLines)Marshal.GetObjectForIUnknown(docDataPointer);
//Createa a code window adapter
var codeWindow = _EditorAdapterFactory.CreateVsCodeWindowAdapter(VisualStudioServices.OLEServiceProvider);
//Associate our IVsTextLines with our new code window
ErrorHandler.ThrowOnFailure(codeWindow.SetBuffer(docData));
//Get our text view for our editor which we will use to get the WPF control that hosts that editor.
IVsTextView textView;
ErrorHandler.ThrowOnFailure(codeWindow.GetPrimaryView(out textView));
//This is our TextViewHost
//It transports us back into the land of WPF
IWpfTextViewHost textViewHost = _EditorAdapterFactory.GetWpfTextViewHost(textView);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//Now we need to subset TextBuffer somehow...
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
int length = end - start;
SnapshotSpan subsetSnapshot = new SnapshotSpan(textViewHost.TextView.TextSnapshot, start, length);
var CSharpType = _contentTypeRegistry.GetContentType("CSharp");
var projBuffer = _ProjectionBufferFactory.CreateElisionBuffer(
null
, new NormalizedSnapshotSpanCollection(subsetSnapshot)
, ElisionBufferOptions.None
,CSharpType);
IVsTextBuffer bufferAdapter = _EditorAdapterFactory.CreateVsTextBufferAdapterForSecondaryBuffer(VisualStudioServices.OLEServiceProvider, projBuffer);
//My attempt at getting syntax coloring to work:
Guid CSharpLanguageServiceId = new Guid("694DD9B6-B865-4C5B-AD85-86356E9C88DC");
IVsTextLines buffer = (IVsTextLines)bufferAdapter;
buffer.SetLanguageServiceID(ref CSharpLanguageServiceId);
IVsTextView projTextView = _EditorAdapterFactory.CreateVsTextViewAdapter(VisualStudioServices.OLEServiceProvider);
projTextView.Initialize(
(IVsTextLines)bufferAdapter
, IntPtr.Zero
, (uint)TextViewInitFlags.VIF_HSCROLL | (uint)TextViewInitFlags.VIF_VSCROLL | (uint)TextViewInitFlags3.VIF_NO_HWND_SUPPORT,
new[] { new INITVIEW { fSelectionMargin = 0, fWidgetMargin = 0, fVirtualSpace = 0, fDragDropMove = 0 } }
);
return _EditorAdapterFactory.GetWpfTextViewHost(projTextView);
}
Solución
Hacer el tipo de contenido de su elisión de búfer de ser, o derivar de, con el tipo de contenido "proyección".Esa es la sugerencia de que taggers proyecto que a través de eso.