Pergunta

Estou trabalhando em um projeto onde dividimos o código C# em funções e armazenamos essas funções dentro ElisonBuffers.Eu tenho o Intellisense conectado e os buffers interagem perfeitamente com outras extensões, conforme mostrado abaixo:

enter image description here

No entanto, não consigo fazer com que o realce de sintaxe funcione nesses editores.

Eu incorporo esses editores por meio das seguintes etapas:

  1. Criar um IVsInvisibleEditor para o arquivo.
  2. Pegue o IVsTextLines por esta IVsInvisibleEditor
  3. Criar um IVsCodeWindow e defina o buffer para isso IVsCodeWindow para ser o IVsTextLines de IVsInvisibleEditor
  4. Obtenha um IWpfTextViewHost nesta janela de código.Isso me traz de volta ao "WPF Land", onde posso interagir com extensões tradicionais.
  5. Crie um SnapshotSpan do IWpfTextViewHostvisualização de texto.Este SnapshotSpan contém uma única função.
  6. Criar um IElisionBuffer contendo o SnapshotSpan.
  7. Criar um IVsTextBuffer através da IVsEditorAdaptersFactoryService.CreateVsTextBufferAdapterForSecondaryBuffer() passando no IElisionBuffer.
  8. Agora eu lancei o IVsTextBuffer para IVsTextLines e ligue SetLanguageServiceID() passando no GUID C#:694DD9B6-B865-4C5B-AD85-86356E9C88DC.
  9. Eu verifico novamente se ele foi configurado corretamente via GetLanguageServiceID() e tudo parece bem.
  10. Eu crio um IVsTextView e inicialize-o com o novo IVsTextBuffer.
  11. Eu então recebo o IWpfTextViewHost por esta IVsTextView.

Há alguma etapa especial que precisa ser seguida ao configurar o ID do serviço de idioma para um IElisionBuffer?

Para completar, este é o código que estou 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);
}
Foi útil?

Solução

Faça com que o tipo de conteúdo do seu buffer de elisão seja ou derive do tipo de conteúdo "projeção".Essa é a dica de que os taggers devem se projetar através disso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top