私の最も簡単な解決法はここにあります。 TL; DR:https://github.com/jimmylewis/GetVSTextViewFormattedTextSampleにコードにジャンプできます。
VSエディタは、特別な意味を持つテキストのセグメントを表示するために "分類"を使用します。これらの分類は、言語とユーザーの設定に応じて異なる形式にすることができます。
文書内の分類を取得するためのAPIがありますが、それは私のためには機能しませんでした。またはother people、明らかに。これらと
[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);
武装、我々は文書を再構築することができます。しかし、我々はまだ右ここで、先行するリンク、またはで説明したように、ITagAggregator<IClassificationTag>
て分類を得ることができます。一部のテキストはではなく、であることに注意することが重要です。すべてをまとめる必要があります。
この時点で、これらのタグがどのようにフォーマットされているか、つまりレンダリング時に使用される色はわかりません。あなたが望むなら、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();
希望:ここでも、覚えて、これはユーザーの設定に影響され、ライトなど暗いテーマ、
いずれかの方法対、それはこのようなものを見ることができます。サンプルのレポは、各編集後にクリップボードに書式設定されたテキストを表示するかどうかを尋ねますが、それはテストして機能しているかどうかを確認するのにはちょっと汚い方法でした。迷惑ですが、それは単なるPoCでした。
あなたはテキストで何をしようとしているのかについてより具体的な詳細を教えてもらえますか?色よりもうまくいく何かがあるかもしれません... – Jimmy
@ジミー私は単にテキストを保存する必要があります。フォーマットする。タイプされたすべてのキーまたは変更(例えば、リファクタリング)が行われるたびに可能ならば、* diff *データもOKです。 –
@DmitryNesterukは別の言い方をすると、* color *が重要ですか、またはフォーマット境界の別の表示があなたのために働くでしょうか? – Jimmy