67

AvalonEdit の SyntaxHighlighting Engine をカスケードしたいと考えています。私は 2 を持っていHighlightingDefinitionsます。最初のものは主な構文です。2 つ目は、複雑な複数行のプリプロセッサ マークアップ言語です。このため、最初の文法に 2 番目の文法を埋め込むのは複雑すぎます。より簡単な方法は、最初の構文をレンダリングし、後で影響を受ける行部分を (2 番目の構文に基づいて) 変更することです。

そこでHighlightingColorizer、2 番目の言語で new をインスタンス化し、LineTransformers. しかし、2 番目の言語は、プリプロセッサ ディレクティブを含む行部分だけでなく、ドキュメント全体を色分けします。非プリプロセッサ コードは黒です。

ColorizeLine2 番目の行トランスフォーマーの -method をデバッグしたところ、強調表示されていないコード (= プリプロセッサ コードがない) の行は、期待どおりに色付けされていません。でも線の色は黒。

HighlightingColorizer色付けを開始する前に、ドキュメント全体の以前の強調表示をすべてリセットしますか?

または、他に何が問題になる可能性がありますか?2 を適切にカスケードするにはどうすればよいHighlightingColorizersですか?

4

1 に答える 1

7

問題は、がHighlightingColorizerへの参照を直接保存するのではなくDocumentHighlighter、を介して保存することTextView.Servicesです。これは、同じカラーライザーを複数のエディターにアタッチできるようにするために行われ、各エディターが独自のを取得しDocumentHighlighterます。

IHighlighter2つ目のカラーライザーを取り付けると、サービスコンテナに保存されているものが上書きされます。そして、両方のカラーライザーが新しい蛍光ペンを使用することになります。

また、「クリップボードにコピー」ロジックはサービスにHtmlClipboard直接アクセスし、IHighlighterカラーライザーを使用しないことに注意してください。(テキストをWordにコピーすると、構文の強調表示のみが保持され、折り目マーカーのような他の変換は保持されません)

この問題を解決するには、基本的に2つのアプローチがあります。

  1. 追加の蛍光ペンをサービスとして保存しないでください。これを行うには、クラスの独自のコピーを作成し、HighlightingColorizerにアクセスする代わりにそのクラスのフィールドを使用しますtextView.Services。これは簡単な変更ですが、テキストをクリップボードにコピーするときに追加の蛍光ペンは使用されません。

  2. 複数のからのIHighlighterを組み合わせた実装を作成します。これは、SharpDevelop 5のC#セマンティックハイライトに使用しているアプローチであり、既存の.xshdベースのC#ハイライトを拡張する追加のハイライターとして機能します。ただし、このアプローチは複雑であり(セクションの順序とネストの制約を考えると、sのマージは簡単ではありません)、通知を処理するためにインターフェイスにAPIを変更する必要があります(AvalonEdit 4.xは、にネストされた派生クラスを使用します)このコールバックにアクセスするには、AvalonEdit 5.0はイベントを使用します)。HighlightedLineDocumentHighlighterHighlightedLineIHighlighterOnHighlightStateChangedHighlightingColorizer

于 2012-10-18T17:51:28.420 に答える