2017-04-17 12 views
0

アクティブドキュメントのテキスト全体を取得するには、VS拡張機能を使用する方法を知っています。残念なことに、それは私にテキストを与えてくれるだけで、私にフォーマットを与えてくれないし、私もそれが欲しい。Visual Studioのアクティブなドキュメントをフォーマットする方法...

たとえば、私はIWpfTextViewを得ることができますが、一度それを得ると、どうすればよいのか分かりません。実際にすべての書式を取得した例がありますか?私は本当にテキストの前景/背景色に興味があるだけです。

注:私は残念ながらオプションではありませんクリップボードを使ってカットアンドペーストをやって、すべての編集でフォーマットされたテキストを必要としています。

+0

あなたはテキストで何をしようとしているのかについてより具体的な詳細を教えてもらえますか?色よりもうまくいく何かがあるかもしれません... – Jimmy

+0

@ジミー私は単にテキストを保存する必要があります。フォーマットする。タイプされたすべてのキーまたは変更(例えば、リファクタリング)が行われるたびに可能ならば、* diff *データもOKです。 –

+0

@DmitryNesterukは別の言い方をすると、* color *が重要ですか、またはフォーマット境界の別の表示があなたのために働くでしょうか? – Jimmy

答えて

1

おそらく最も簡単な方法は、すべてのテキストを選択してクリップボードにコピーすることです。 VSはリッチテキストをクリップボードに置きます。そのため、別の場所に貼り付けると、色を取得します(リッチテキストを処理すると仮定します)。

+0

残念ながら、すべての編集で書式設定が必要なので、計算できません。答えを明らかにする。 –

1

私の最も簡単な解決法はここにあります。 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でした。