IelisonBufferに強調表示を強調表示します
-
02-01-2020 - |
質問
私たちはC#コードを関数に分割し、これらの関数を ielisonbuffers 。私はIntelliSenseのフックアップを持っていて、バッファーは下記のようにファインされている他の拡張機能と対話します:
しかし、これらのエディタ内での構文の強調表示を取得することはできません。
次の手順でこれらのエディタを埋め込みます。
- ファイルに
IVsInvisibleEditor
を作成します。 - この
IVsTextLines
の -
IVsCodeWindow
を作成し、このIVsCodeWindow
のバッファをIVsTextLines
から - このコードウィンドウから
IWpfTextViewHost
を取得します。これは私が伝統的なスパンと対話することができる「WPFの土地」に戻ります。 -
IWpfTextViewHost
のテキストビューのスナップショットパンを作成します。このスナップショットパンには単一の機能が含まれています。 - スナップショットパンを含む
IElisionBuffer
を作成します。 -
IVsTextBuffer
を介してIVsEditorAdaptersFactoryService.CreateVsTextBufferAdapterForSecondaryBuffer()
を介してIElisionBuffer
を作成します。 - 今度は
IVsTextBuffer
をC#GUIDに渡し、C#GUIDを渡します.694DD9B6-B865-4C5B-AD85-86356E9C88DC。 - 私はそれが
IVsTextLines
を介して正しく設定されていて、すべてが大丈夫に見えることを再確認してください。 -
SetLanguageServiceID()
を作成し、新しいGetLanguageServiceID()
を使用して初期化します。 - 私はこの
IVsTextView
のIVsTextBuffer
を取得します。
IVsInvisibleEditor
を取得します。
IVsInvisibleEditor
に設定します。
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);
}
.解決
フィニジョンバッファのコンテンツタイプを作成するか、またはコンテンツタイプの「投影」を作成します。それがタグガーがそれを通してプロジェクトするべきヒントです。
所属していません StackOverflow