8

私はカスタムVisualStudio言語サービスに取り組んでおり、ファイル拡張子が特定の言語サービスにバインドされる方法に関していくつか質問があります。

言語「ExampleLanguage」のソースファイルには、2つの主要なファイル拡張子があります:.e1.e2ExampleLanguagePackage私の拡張機能には、を拡張するクラスがありますPackage

  1. [ファイル]→[開く]コマンドを使用してC#ファイルを選択すると(たとえば)、[開く]ボタンには[プログラムから開く...]を選択できるドロップダウン矢印があります。そのボタンをクリックすると、「CSharp Editor(デフォルト)」、「CSharp Editor with Encoding」、またはその他のいくつかのオプションでファイルを開くためのオプションが表示されます。「サンプル言語(デフォルト)」および「エンコーディング付きのサンプル言語」オプションを提供して、自分の言語に同様の機能を提供するにはどうすればよいですか?

  2. [ツール]→[オプション...]→[テキストエディタ]→[ファイル拡張子]を開くと、(たとえば).foo拡張子を「MicrosoftVisualC#」または他のいくつかのオプションのいずれかにバインドすることができます。このページを拡張して、ユーザー定義のファイル拡張子を「サンプル言語」に関連付けるにはどうすればよいですか?

  3. これらのアイテムを登録するとき、他に何に注意する必要がありますか?

4

1 に答える 1

15

これらの項目のほとんどはIVsEditorFactory、言語のカスタム実装を追加し、登録属性の組み合わせを使用して登録することで対処されます。このインターフェイスの実際の実装はこの質問の範囲を超えていますが、インターフェイス自体のドキュメント(およびそのページにリンクされている)と、 Python Tools forVisualStudioプロジェクトDjangoEditorFactoryの実装例が最初の実装に役立ちました。

サンプル言語をサポートするために、次の仮定を行います。

  • ExampleEditorFactoryのコア実装を提供する抽象クラスを実装しましたIVsEditorFactory。クラスには、ファクトリがユーザーにエンコーディングのプロンプトを表示するかどうかを指定する引数を持つ保護されたコンストラクターがbool必要です(のコンストラクターの1つと同様DjangoEditorFactory)。
    • 引数を指定する基本クラスExampleEditorFactoryWithoutEncodingを拡張ExampleEditorFactoryおよび構築するクラスがあります。このクラスは、属性でマークする必要があります。falsepromptForEncoding[Guid]
    • 引数を指定する基本クラスExampleEditorFactoryWithEncodingを拡張ExampleEditorFactoryおよび構築するクラスがあります。このクラスは、属性でマークする必要があります。truepromptForEncoding[Guid]
  • VSPackage.resxリソースファイルに次のエントリを追加しました。定数は変更できますが、以下の定数値101と102を使用していることに注意してください。
    • 101=サンプル言語

    • 102=エンコーディングを使用した言語の例

編集工場の登録

最初に行うことは、エディターファクトリを登録することです。これは2つの部分で行われます。

まず、を使用しProvideEditorFactoryAttributeます。この属性は、ファクトリの表示名のリソースIDをファクトリタイプ自体に関連付けます。

[ProvideEditorFactory(typeof(ExampleEditorFactoryWithoutEncoding), 101)]
[ProvideEditorFactory(typeof(ExampleEditorFactoryWithEncoding), 102)]

次に、のInitializeメソッドで、を呼び出した後にへのExampleLanguagePackage呼び出しを追加します。RegisterEditorFactorybase.Initialize()

protected override void Initialize()
{
    base.Initialize();

    RegisterEditorFactory(new ExampleEditorFactoryWithoutEncoding(this));
    RegisterEditorFactory(new ExampleEditorFactoryWithEncoding(this));
}

論理ビューをエディターファクトリに関連付ける

属性のユースケースについて必要なすべての情報が見つかりませんでしたがProvideEditorLogicalViewAttribute、少なくとも次の情報を含めることが重要です。作成した両方のファクトリに論理ビューを登録してください。

[ProvideEditorLogicalView(typeof(ExampleEditorFactoryWithoutEncoding), VSConstants.LOGVIEWID.TextView_string)]
[ProvideEditorLogicalView(typeof(ExampleEditorFactoryWithEncoding), VSConstants.LOGVIEWID.TextView_string)]

この手順を実行しないと、出力ウィンドウをダブルクリックしてコード行に移動できる機能が期待どおりに機能しません。たとえば、出力ウィンドウに次のような行が含まれているとします。

c:\dev\file.e1(14,3): unexpected expression

TextView論理ビューを関連付けると、この出力行をダブルクリックしてファイルc:\ dev \ file.e1の行14、列3に移動したときに、IDEがファクトリを使用できるようになります。そうしないと、別のファクトリを使用してドキュメントの新しいコピーを開き、新しいウィンドウに多くの機能がない可能性があります。

標準のファイル拡張子.e1.e2エディタファクトリを関連付けます

このステップは、元の質問1で説明されている.e1および.e2ファイルの「OpenWith ...」サポートを提供します。このステップは、ProvideEditorExtensionAttribute属性を使用して実行されます。

プライマリファクトリのデフォルトの優先度は50のようです。明示的なエンコーディングを使用するファクトリの優先度はこれより低くする必要があり、49が適切な選択のようです。NameResourceID上記の使用法ですでに指定されているため、名前付きパラメーターを指定する必要がないことに注意してくださいProvideEditorFactoryAttribute(生成されたレジストリキーは同一です)。

[ProvideEditorExtension(typeof(ExampleEditorFactoryWithoutEncoding), ".e1", 50)]
[ProvideEditorExtension(typeof(ExampleEditorFactoryWithoutEncoding), ".e2", 50)]
[ProvideEditorExtension(typeof(ExampleEditorFactoryWithEncoding), ".e1", 49)]
[ProvideEditorExtension(typeof(ExampleEditorFactoryWithEncoding), ".e2", 49)]

.*拡張機能をエディターファクトリに関連付けます

この手順では、他のすべてのファイルに「Open With ...」サポートを提供し、元の質問2で説明したファイル拡張子オプションのサポートを追加します。この手順でもProvideEditorExtensionAttribute属性を使用しますが、デフォルトを保証するためにはるかに低い優先度値を使用します他のファイルタイプのエディターは、設定によって上書きされません。前の手順と同様に、明示的なエンコードを使用するファクトリには低い優先度が与えられます。

[ProvideEditorExtension(typeof(ExampleEditorFactoryWithoutEncoding), ".*", 2)]
[ProvideEditorExtension(typeof(ExampleEditorFactoryWithEncoding), ".*", 1)]

最終メモ

この回答はいくつかの詳細をカバーしていません。

于 2013-03-07T05:27:15.920 に答える