IElisonBuffer에 구문 강조 표시 추가
-
02-01-2020 - |
문제
저는 C# 코드를 함수로 분할하고 이러한 함수를 저장하는 프로젝트를 진행 중입니다. IElisonBuffers.Intellisense가 연결되어 있고 버퍼는 아래와 같이 다른 확장 프로그램과 잘 상호 작용합니다.
그러나 이러한 편집기에서는 구문 강조가 작동하지 않습니다.
다음 단계를 통해 이러한 편집기를 포함합니다.
- 만들기
IVsInvisibleEditor
파일을 위해. - 받기
IVsTextLines
이를 위해IVsInvisibleEditor
- 만들기
IVsCodeWindow
이에 대한 버퍼를 설정합니다.IVsCodeWindow
될IVsTextLines
~로부터IVsInvisibleEditor
- 받기
IWpfTextViewHost
이 코드 창에서.그러면 전통적인 범위와 상호 작용할 수 있는 "WPF Land"가 다시 표시됩니다. - SnapshotSpan을 생성합니다.
IWpfTextViewHost
님의 텍스트 보기입니다.이 SnapshotSpan에는 단일 함수가 포함되어 있습니다. - 만들기
IElisionBuffer
SnapshotSpan을 포함합니다. - 만들기
IVsTextBuffer
~을 통해IVsEditorAdaptersFactoryService.CreateVsTextBufferAdapterForSecondaryBuffer()
통과하다IElisionBuffer
. - 이제 나는
IVsTextBuffer
에게IVsTextLines
그리고 전화해SetLanguageServiceID()
C# GUID를 전달합니다.694DD9B6-B865-4C5B-AD85-86356E9C88DC. - 다음을 통해 올바르게 설정되었는지 다시 확인합니다.
GetLanguageServiceID()
모든 것이 괜찮아 보입니다. - 나는
IVsTextView
새로운 것으로 초기화하십시오.IVsTextBuffer
. - 그런 다음 나는
IWpfTextViewHost
이를 위해IVsTextView
.
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