Domanda

Sto lavorando a un progetto in cui abbiamo diviso il codice C # in funzioni e memorizzate queste funzioni all'interno ielisonbuffer . Ho collegato Intellisense e i buffer interagiscono con altre estensioni belle come mostrato di seguito:

Inserisci Descrizione dell

Tuttavia, non riesco a ottenere l'evidenziazione della sintassi per funzionare all'interno di questi redattori.

I Incorpora questi editor tramite i seguenti passaggi:

    .
  1. Crea un IVsInvisibleEditor per il file.
  2. Ottieni il IVsTextLines per questo IVsInvisibleEditor
  3. Creare un IVsCodeWindow e imposta il buffer per questo IVsCodeWindow per essere il IVsTextLines dal IVsInvisibleEditor
  4. Ottieni un IWpfTextViewHost da questa finestra del codice. Questo mi riporta a "WPF Land" dove sono in grado di interagire con le campagne tradizionali.
  5. Crea una snapshotspan della vista del testo del IWpfTextViewHost. Questo snapshotspan contiene una singola funzione.
  6. Crea un IElisionBuffer contenente gli snapshotspan.
  7. Creare un IVsTextBuffer tramite IVsEditorAdaptersFactoryService.CreateVsTextBufferAdapterForSecondaryBuffer() che passa il generatore di IElisionBuffer.
  8. Ora ho lanciato il IVsTextBuffer a IVsTextLines e chiama SetLanguageServiceID() passando nel c # GUID: 694DD9B6-B865-4C5B-AD85-86356E9C88DC.
  9. I Controllare che sia stato impostato correttamente tramite GetLanguageServiceID() e tutto sembra bene.
  10. Creo un IVsTextView e inizializzalo con il nuovo IVsTextBuffer.
  11. Quindi prendi il IWpfTextViewHost per questo IVsTextView.
  12. Ci sono dei passaggi speciali che devono essere presi cura di quando si imposta l'ID del servizio linguistico per un IelInInkBuffer?

    Per la completezza, questo è il codice che sto 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);
    }
    
    .

È stato utile?

Soluzione

Rendi il tipo di contenuto del tuo buffer di elisioni, o deriva da, il tipo di contenuto "proiezione".Questo è il suggerimento che i tagger dovrebbero proiettarlo attraverso questo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top