2
我正在開發一個項目,在該項目中我們已將C#代碼分解爲函數,並將這些函數存儲在IElisonBuffers之內。我有智能感知勾搭上了,並且緩衝器細其它擴展交互,如下圖所示:向IElisonBuffer添加語法高亮
但是,我不能讓語法高亮這些編輯器內工作。
我通過以下步驟嵌入這些編輯:
- 創建該文件的
IVsInvisibleEditor
。 - 獲取
IVsTextLines
這IVsInvisibleEditor
- 創建
IVsCodeWindow
並設置緩衝區此IVsCodeWindow
是從IVsInvisibleEditor
- 的
IVsTextLines
獲得從該代碼窗口中IWpfTextViewHost
。這使我回到了「WPF Land」,我可以在這裏與傳統跨度進行交互。 - 創建
IWpfTextViewHost
的文本視圖的SnapshotSpan。此SnapshotSpan包含一個功能。 - 創建一個包含SnapshotSpan的
IElisionBuffer
。 - 通過
IVsEditorAdaptersFactoryService.CreateVsTextBufferAdapterForSecondaryBuffer()
通過IElisionBuffer
創建IVsTextBuffer
。 - 現在我將
IVsTextBuffer
改爲IVsTextLines
,並調用SetLanguageServiceID()
傳入C#GUID:694DD9B6-B865-4C5B-AD85-86356E9C88DC。 - 我仔細檢查它是否通過
GetLanguageServiceID()
正確設置,一切看起來都不錯。 - 我創建了一個
IVsTextView
並使用新的IVsTextBuffer
進行初始化。 - 然後我得到這個
IVsTextView
的IWpfTextViewHost
。
在爲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);
}
如果我使用ProjectionContentType創建Elision Buffer,我會獲得語法高亮顯示,但在編輯器中會失去Intellisense和VsVim(插件不會像他們應該那樣連接它)。 有沒有手動設置語法高亮的選項?我擔心手動設置智能感知會更困難。 – JoshVarty
感謝您的幫助。我的錯誤部分是由於內容類型不正確,部分原因是由於爲單個文件創建了多個IVsInvisibleEditors。 – JoshVarty
我正在做類似的事情。但我正在使用不屬於解決方案的臨時文件路徑。它有一些解析錯誤。那些解析錯誤出現在錯誤列表中,有沒有告訴visual studio在錯誤列表窗口中不顯示解析錯誤? – ravyoli