3

NoahRichardsのdiffカラーリングサンプルに基づいたVS2010の新しい構文カラーリング機能を試してみています。目標は、SpecFlow(http://www.specflow.org)の構文カラーリングを作成することです。

私の場合、構文要素の検索はかなり複雑で、行レベルではありません。したがって、GetClassificationSpansを実装するときは、ファイル全体を再解析するのではなく、変更されたテキストの先頭の状態を取得して、その時点からコンテンツを解析します。

以前の分類をClassificationTagsとして取得できると思いました。IBufferTagAggregatorFactoryServiceクラスを使用してこれを行いました。

それは機能しますが、これが最善の方法かどうかはわかりません。分類子クラス全体に対してタグアグリゲーターのみを作成しますか、それともGetClassificationSpansが呼び出されるたびに作成できますか?解析状態を記憶するための特別なタグを作成しませんか?

とにかくこれは正しい方法ではないかもしれませんが、他の提案にも興味があります。

Br、Gaspar

編集:トピックで良い記事シリーズを見つけました:http ://www.hill30.com/MikeFeingoldBlog/index.php/2009/07/31/django-editor-in-vs-2010-part-1-色/

4

1 に答える 1

4

基本的に、自分で状態を覚えておく必要があります。ほとんどのVS言語サービスは、テキストの変更時に更新される各行の先頭に状態Cookieを保持します。

どの時点でも、(分類子アグリゲーターまたはタグアグリゲーターのいずれかを介して)分類を取得すると、常に現在の分類子/タガーが呼び出されるため、キャッシュされた状態(または返された「最後の」分類)は返されません。 。エディターは実際にはこの情報をキャッシュせず、分類子がフォーマットされている表示行に提供する情報のダムパススルーとして機能します。

また、分類子(IClassifierProviderまたはITaggerProviderのいずれかによって提供される)からそれを行う場合、特に分類子GetClassificationSpansがアグリゲーターを呼び出すことによって応答する場合(その後、分類子を呼び出すと、いくつかの厄介な再帰が発生する可能性があります)以前のテキストなど)。分類器が正しく機能するために他の分類を使用する必要がある場合(それ自体の分類ではない)、それを書くための唯一の安全な方法は次のとおりです。

  1. 「分類子」をとして実装しITagger<IClassificationTag>、から提供しますIViewTaggerProvider
  2. ITagAggregator<IClassificationTag>からを取得しIBufferTagAggregatorFactoryServiceますが、1回だけです。
  3. タガーに実装IDisposableし、タグアグリゲーターをに配置しDispose()ます。
于 2010-07-01T18:15:49.460 に答える