내 가장 간단한 해결책은 여기 있습니다. 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에 불과했습니다.
텍스트를 사용하여 수행하려는 작업에 대한 자세한 정보를 제공 할 수 있습니까? 색보다 잘 작동하는 다른 것이있을 수 있습니다 ... – Jimmy
@ 지미 나는 단순히 텍스트를 저장해야합니다. 서식 지정. 입력 된 모든 키 또는 모든 변경 사항 (예 : 리팩토링)에 대해 가능하다면 * diff * 데이터도 괜찮습니다. –
@DmitryNesteruk 다른 식으로 표시하려면 * color *가 중요하거나 서식 경계의 또 다른 표시가 당신에게 효과가 있습니까? – Jimmy