2017-04-17 14 views
0

VS 확장 성을 사용하여 전체 활성 문서의 텍스트를 가져 오는 방법을 알고 있습니다. 불행하게도, 그것은 단지 나에게 텍스트를 얻고 포맷팅을주지 않는다. 나는 그것을 원한다.전체 Visual Studio 활성 문서를 서식 지정하는 방법

나는 예를 들어 IWpfTextView을 얻을 수 있지만 얻을 수있게되면 어떻게해야할지 모르겠다. 실제로 모든 서식을 얻는 예제가 있습니까? 텍스트 전경/배경색에만 관심이 있습니다. 바로 그 것입니다.

참고 : 난 너무 불행하게도 옵션이 아닙니다 클립 보드를 사용하여 잘라 내기 및 붙여 넣기를하고, 모든 편집에 서식있는 텍스트가 필요합니다.

+0

텍스트를 사용하여 수행하려는 작업에 대한 자세한 정보를 제공 할 수 있습니까? 색보다 잘 작동하는 다른 것이있을 수 있습니다 ... – Jimmy

+0

@ 지미 나는 단순히 텍스트를 저장해야합니다. 서식 지정. 입력 된 모든 키 또는 모든 변경 사항 (예 : 리팩토링)에 대해 가능하다면 * diff * 데이터도 괜찮습니다. –

+0

@DmitryNesteruk 다른 식으로 표시하려면 * color *가 중요하거나 서식 경계의 또 다른 표시가 당신에게 효과가 있습니까? – Jimmy

답변

1

아마도 가장 간단한 방법은 텍스트를 모두 선택하여 클립 보드에 복사하는 것입니다. VS는 서식있는 텍스트를 클립 보드에 저장하므로 다른 곳에 붙여 넣을 때 색상을 얻을 수 있습니다 (대상에서 서식있는 텍스트를 처리한다고 가정).

+0

불행히도 모든 편집 작업에 서식이 필요하기 때문에 불행히도 계산할 수 없습니다. 나는 그 대답을 분명히 할 것이다. –

1

내 가장 간단한 해결책은 여기 있습니다. TL : DR : 코드 https://github.com/jimmylewis/GetVSTextViewFormattedTextSample으로 바로 이동할 수 있습니다.

VS 편집기는 "분류"를 사용하여 특별한 의미를 갖는 텍스트 세그먼트를 표시합니다. 이러한 분류는 언어 및 사용자 설정에 따라 다르게 형식을 지정할 수 있습니다.

문서에서 분류를 가져 오는 API가 있지만 작동하지 않습니다. 또는 other people, 분명히. 바로 여기에 위의 링크에 설명, 또는 그러나 우리는 여전히, ITagAggregator<IClassificationTag>을 통해 분류를 얻을 수 있습니다 : 다음과

[Import] 
IViewTagAggregatorFactoryService tagAggregatorFactory = null; 

// in some method... 
var classificationAggregator = tagAggregatorFactory.CreateTagAggregator<IClassificationTag>(textView); 
var wholeBufferSpan = new SnapshotSpan(textBuffer.CurrentSnapshot, 0, textBuffer.CurrentSnapshot.Length); 
var tags = classificationAggregator.GetTags(wholeBufferSpan); 

무장, 우리는 문서를 재 구축 할 수 있습니다. 일부 텍스트는 이 아닌으로 분류되어 있으므로 모든 항목을 청크로 묶어야합니다.

이 시점에서 이러한 태그가 어떻게 형식화되었는지, 즉 렌더링하는 동안 사용되는 색상은 알 수 없습니다. 원하는 경우 IClassificationType에서 원하는 색으로 자신의 매핑을 정의 할 수 있습니다. 또는 VS에 IClassificationFormatMap을 사용하여 수행 할 작업을 요청할 수 있습니다. 이것은 당신이하고있는 무엇에 도움이

// Magic sauce pt1: See the example repo for an RTFStringBuilder I threw together. 
RTFStringBuilder sb = new RTFStringBuilder(); 
var wholeBufferSpan = new SnapshotSpan(textBuffer.CurrentSnapshot, 0, textBuffer.CurrentSnapshot.Length); 
// Magic sauce pt2: see the example repo, but it's basically just 
// mapping the spans from the snippet above with the formatting settings 
// from the IClassificationFormatMap. 
var textSpans = GetTextSpansWithFormatting(textBuffer); 

int currentPos = 0; 
var formattedSpanEnumerator = textSpans.GetEnumerator(); 
while (currentPos < wholeBufferSpan.Length && formattedSpanEnumerator.MoveNext()) 
{ 
    var spanToFormat = formattedSpanEnumerator.Current; 
    if (currentPos < spanToFormat.Span.Start) 
    { 
     int unformattedLength = spanToFormat.Span.Start - currentPos; 
     SnapshotSpan unformattedSpan = new SnapshotSpan(textBuffer.CurrentSnapshot, currentPos, unformattedLength); 
     sb.AppendText(unformattedSpan.GetText(), System.Drawing.Color.Black); 
    } 

    System.Drawing.Color textColor = GetTextColor(spanToFormat.Formatting.ForegroundBrush); 
    sb.AppendText(spanToFormat.Span.GetText(), textColor); 

    currentPos = spanToFormat.Span.End; 
} 

if (currentPos < wholeBufferSpan.Length) 
{ 
    // append any remaining unformatted text 
    SnapshotSpan unformattedSpan = new SnapshotSpan(textBuffer.CurrentSnapshot, currentPos, wholeBufferSpan.Length - currentPos); 
    sb.AppendText(unformattedSpan.GetText(), System.Drawing.Color.Black); 
} 

return sb.ToString(); 

희망 : 다시, 기억이 사용자 설정에 의해 영향을받는, 빛 등의 어둠의 테마,

어느 쪽이든 대,이 같은 것을 볼 수 있었다. 예제 repo는 각 편집 후에 클립 보드에 형식화 된 텍스트가 필요한지 물어볼 것입니다. 그러나 그것은 테스트 할 수있는 더러운 방법이었습니다. 짜증나지만 PoC에 불과했습니다.