2

我正在開發一個項目,在該項目中我們已將C#代碼分解爲函數,並將這些函數存儲在IElisonBuffers之內。我有智能感知勾搭上了,並且緩衝器細其它擴展交互,如下圖所示:向IElisonBuffer添加語法高亮

enter image description here

但是,我不能讓語法高亮這些編輯器內工作。

我通過以下步驟嵌入這些編輯:

  1. 創建該文件的IVsInvisibleEditor
  2. 獲取IVsTextLinesIVsInvisibleEditor
  3. 創建IVsCodeWindow並設置緩衝區此IVsCodeWindow是從IVsInvisibleEditor
  4. IVsTextLines獲得從該代碼窗口中IWpfTextViewHost。這使我回到了「WPF Land」,我可以在這裏與傳統跨度進行交互。
  5. 創建IWpfTextViewHost的文本視圖的SnapshotSpan。此SnapshotSpan包含一個功能。
  6. 創建一個包含SnapshotSpan的IElisionBuffer
  7. 通過IVsEditorAdaptersFactoryService.CreateVsTextBufferAdapterForSecondaryBuffer()通過IElisionBuffer創建IVsTextBuffer
  8. 現在我將IVsTextBuffer改爲IVsTextLines,並調用SetLanguageServiceID()傳入C#GUID:694DD9B6-B865-4C5B-AD85-86356E9C88DC。
  9. 我仔細檢查它是否通過GetLanguageServiceID()正確設置,一切看起來都不錯。
  10. 我創建了一個IVsTextView並使用新的IVsTextBuffer進行初始化。
  11. 然後我得到這個IVsTextViewIWpfTextViewHost

在爲IElisionBuffer設置語言服務ID時是否需要注意任何特殊步驟?

爲了完整本的緣故是我使用的代碼:

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); 
} 

回答

3

讓您省音緩衝區的內容類型,或從內容型「投影」派生。這就是標註人員應該通過該項目進行投影的暗示。

+0

如果我使用ProjectionContentType創建Elision Buffer,我會獲得語法高亮顯示,但在編輯器中會失去Intellisense和VsVim(插件不會像他們應該那樣連接它)。 有沒有手動設置語法高亮的選項?我擔心手動設置智能感知會更困難。 – JoshVarty

+0

感謝您的幫助。我的錯誤部分是由於內容類型不正確,部分原因是由於爲單個文件創建了多個IVsInvisibleEditors。 – JoshVarty

+0

我正在做類似的事情。但我正在使用不屬於解決方案的臨時文件路徑。它有一些解析錯誤。那些解析錯誤出現在錯誤列表中,有沒有告訴visual studio在錯誤列表窗口中不顯示解析錯誤? – ravyoli