これらの項目のほとんどはIVsEditorFactory
、言語のカスタム実装を追加し、登録属性の組み合わせを使用して登録することで対処されます。このインターフェイスの実際の実装はこの質問の範囲を超えていますが、インターフェイス自体のドキュメント(およびそのページにリンクされている)と、 Python Tools forVisualStudioプロジェクトDjangoEditorFactory
の実装例が最初の実装に役立ちました。
サンプル言語をサポートするために、次の仮定を行います。
ExampleEditorFactory
のコア実装を提供する抽象クラスを実装しましたIVsEditorFactory
。クラスには、ファクトリがユーザーにエンコーディングのプロンプトを表示するかどうかを指定する引数を持つ保護されたコンストラクターがbool
必要です(のコンストラクターの1つと同様DjangoEditorFactory
)。
- 引数を指定する基本クラス
ExampleEditorFactoryWithoutEncoding
を拡張ExampleEditorFactory
および構築するクラスがあります。このクラスは、属性でマークする必要があります。false
promptForEncoding
[Guid]
- 引数を指定する基本クラス
ExampleEditorFactoryWithEncoding
を拡張ExampleEditorFactory
および構築するクラスがあります。このクラスは、属性でマークする必要があります。true
promptForEncoding
[Guid]
- VSPackage.resxリソースファイルに次のエントリを追加しました。定数は変更できますが、以下の定数値101と102を使用していることに注意してください。
101=サンプル言語
102=エンコーディングを使用した言語の例
編集工場の登録
最初に行うことは、エディターファクトリを登録することです。これは2つの部分で行われます。
まず、を使用しProvideEditorFactoryAttribute
ます。この属性は、ファクトリの表示名のリソースIDをファクトリタイプ自体に関連付けます。
[ProvideEditorFactory(typeof(ExampleEditorFactoryWithoutEncoding), 101)]
[ProvideEditorFactory(typeof(ExampleEditorFactoryWithEncoding), 102)]
次に、のInitialize
メソッドで、を呼び出した後にへのExampleLanguagePackage
呼び出しを追加します。RegisterEditorFactory
base.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)]
最終メモ
この回答はいくつかの詳細をカバーしていません。