Вопрос

Я работаю над проектом, в котором мы разделили код C# на функции и сохранили эти функции внутри. IElisonBuffers.У меня подключен Intellisense, и буферы прекрасно взаимодействуют с другими расширениями, как показано ниже:

enter image description here

Однако я не могу заставить подсветку синтаксиса работать в этих редакторах.

Я встраиваю эти редакторы, выполнив следующие шаги:

  1. Создать IVsInvisibleEditor для файла.
  2. Получить IVsTextLines для этого IVsInvisibleEditor
  3. Создать IVsCodeWindow и установите буфер для этого IVsCodeWindow быть IVsTextLines из IVsInvisibleEditor
  4. Получите IWpfTextViewHost из этого окна кода.Это возвращает меня в «WPF Land», где я могу взаимодействовать с традиционными интервалами.
  5. Создайте SnapshotSpan IWpfTextViewHostтекстовый вид.Этот SnapshotSpan содержит одну функцию.
  6. Создать IElisionBuffer содержащий SnapshotSpan.
  7. Создать IVsTextBuffer с помощью IVsEditorAdaptersFactoryService.CreateVsTextBufferAdapterForSecondaryBuffer() проходя в IElisionBuffer.
  8. Теперь я бросаю IVsTextBuffer к IVsTextLines и позвони SetLanguageServiceID() передача C# GUID:694DD9B6-B865-4C5B-AD85-86356E9C88DC.
  9. Я дважды проверяю, что он был установлен правильно через GetLanguageServiceID() и все выглядит в порядке.
  10. Я создаю IVsTextView и инициализируйте его новым IVsTextBuffer.
  11. тогда я получаю IWpfTextViewHost для этого IVsTextView.

Существуют ли какие-либо особые действия, которые необходимо предпринять при настройке идентификатора языковой службы для IElisionBuffer?

Для полноты картины я использую следующий код:

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);
}
Это было полезно?

Решение

Сделайте так, чтобы тип контента вашего буфера элизии был типом контента «проекция» или производным от него.Это намек на то, что тегеры должны это проецировать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top