2

저는 C# 코드를 함수로 분리하여이 함수를 IElisonBuffers 내에 저장 한 프로젝트를 진행하고 있습니다. 아래 그림과 같이 나는 인텔리가 매여있어, 및 버퍼 잘 다른 확장과 상호 작용 :구문 강조 표시 IElisonBuffer에

enter image description here

그러나, 나는이 에디터 내에서 작동하도록 구문 강조를 얻을 수 없습니다.

나는 다음과 같은 단계를 통해 이러한 편집기를 포함 :

  1. 이 파일에 대한 IVsInvisibleEditor을 만듭니다.
  2. IVsCodeWindow이 코드 창에서 IWpfTextViewHost 얻기 IVsInvisibleEditor
  3. 에서 IVsTextLines로이 IVsInvisibleEditor
  4. 에 대한 IVsTextLines 버퍼를 IVsCodeWindow를 생성하고 설정 가져옵니다. 이것은 내가 전통적인 범위와 상호 작용할 수있는 "WPF Land"로 나를 데려옵니다.
  5. IWpfTextViewHost의 텍스트보기 SnapshotSpan을 만듭니다. 이 SnapshotSpan은 단일 기능을 포함합니다.
  6. SnapshotSpan이 포함 된 IElisionBuffer을 만듭니다.
  7. IElisionBuffer에 전달되는 IVsEditorAdaptersFactoryService.CreateVsTextBufferAdapterForSecondaryBuffer()을 통해 IVsTextBuffer을 생성하십시오.
  8. 이제 IVsTextBufferIVsTextLines으로 캐스팅하고 SetLanguageServiceID()을 C# GUID : 694DD9B6-B865-4C5B-AD85-86356E9C88DC로 전달하십시오.
  9. GetLanguageServiceID()을 통해 올바르게 설정되었고 모든 것이 올바르게 보 였는지 다시 한 번 확인합니다.
  10. IVsTextView을 만들고 새 IVsTextBuffer으로 초기화하십시오.
  11. 다음은 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); 
} 

답변

3

이 생략 버퍼의 콘텐츠 형식이 될 수 있는지 확인하거나, 콘텐츠 유형 "투사"에서 파생 : 완전성이를 위해서

내가 사용하고 코드입니다. 그것은 태그 작성자가이를 통해 프로젝트해야한다는 힌트입니다.

+0

ProjectionContentType을 사용하여 Elision 버퍼를 만드는 경우 구문 강조를 얻을 수 있지만 Intellisense 및 VsVim은 편집기에서 손실됩니다 (플러그인은 꼭 그렇게 연결하지 않습니다). 구문 강조 표시를 수동으로 설정하기위한 옵션이 있습니까? 나는 Intellisense를 수동으로 설정하는 것이 더 어려울 것이라고 걱정한다. – JoshVarty

+0

도움 주셔서 감사합니다. 내 오류는 부분적으로 잘못된 내용 유형 및 단일 파일에 대해 여러 IVsInvisibleEditors를 작성했기 때문에 발생했습니다. – JoshVarty

+0

나는 비슷한 것을하고있다. 하지만 솔루션의 일부가 아닌 임시 파일 경로를 사용하고 있습니다. 파싱 ​​오류가 있습니다. 그 파싱 오류가 오류 목록에 나타나면 오류 목록 창에 파싱 오류가 표시되지 않도록 Visual Studio에 알리는 것이 있습니까? – ravyoli