8

メソッドの呼び出しに基づいてテキストを展開する Visual Studio 2010 VSIX 拡張機能を構築したいと考えています ( Zen コーディング セレクター ベースの構文を使用)。理想的には、ユーザーがテキストの文字列を入力し、ホットキーを押すと、テキストの文字列が展開されます。

私は多くのサンプルを見てきましたが、それらはすべて本格的な言語サービスまたは単純な装飾に焦点を当てています. 理想的には、完全に機能するサンプルを見つけたいと思っていますが、インターフェース/クラスといくつかのコードに満足しています.

私が見たいくつかの参考文献:

更新: Resharper と CodeRush がこの種のことを行うことは知っています。可能であれば、これをスタンドアロンのプラグインとして実行したいと考えています。

4

3 に答える 3

9

Visual Studio バッファーにテキストを挿入するためにキーボード処理を行う方法の良い例/参照を探しているようです。

残念ながら、これは簡単に答えられる質問ではありません。Visual Studio でのキーボードの処理は複雑で、ときどきイライラすることがあります。私はこの答えをできる限りシンプルにしようとしましたが、残念ながらこのトピックはシンプルにはなりません

まず、Visual Studio がキーボード入力をコマンドにルーティングするメカニズムが少なくとも 5 つあります。

これらのどれに接続する必要があるかは、いくつかの要因によって異なります

  • アドインを機能させたい Visual Studio のバージョンは何ですか?
  • 作成するアドインの種類: 実際のアドイン、Vs パッケージ、または VSIX
  • キーボード入力の戦いに勝つことをどれだけ気にかけているか

これらのどれにフックする必要があるかは、アドインをどのように機能させたいか、およびどのバージョンの Visual Studio で機能させたいかによって大きく異なります。2つの基本的なルートがありますが、

1 つ目は、Visual Studio パッケージを開発DTE.Commandし、拡張機能のすべてのホットキーを登録することです。IOleCommandTarget次に、コマンドを処理するためにIVsTextViews フィルター チェーンに追加する必要があります。このアプローチにより、ほとんどのシナリオでホット キーを処理できます。

2 つ目は、VSIX を開発し、のIOleCommandTargetチェーンにフックしIVsTextViewて、ホット キーにマップされる実際の Visual Studio コマンドをインターセプトすることです。

これらのアプローチにはどちらも浮き沈みがありますが、私の答えはすでに少し長すぎます。詳細を教えていただければ、より簡潔で役立つ回答を提供できるように努めます。

例として。VsVim は、Visual Studio 用にかなり広範なキーボード処理を行い、上記の方法のいずれかの例を示しています。

興味のあるものをお知らせください。ソース コードの適切な場所をご案内します。

さらに、キーボード入力の複雑さを理解しようと取り組んでいる間、学んだことをすべて記録しようとしました。完全に最新ではありませんが、このドキュメントでは、入力がルーティングされる方法のより基本的な側面について説明します

編集

Jon はコメントで VSIX +IOleCommandTargetルートを示しました

これは私見の最も簡単なアプローチです。IOleCommandTargetただし、注意すべきことの 1 つは、コマンド バインディングがチェーンを下って渡されるデータにどのように影響するかということです。IOleCommandTargetVisual Studio のコマンド バインディングは、データがチェーンに渡される前に発生します。そのため、特定のキー入力がコマンドにバインドされているIOleCommandTarget場合、キーボード入力ではなくコマンドとして渡されます。

たとえば、CTRL-Z一般的に Visual StudioUndoコマンドにマップされます。ユーザーがヒットすると、キーボード入力ではなく元CTRL-ZIOleCommandTarget戻すコマンドが表示されますCTRL-Z

興味のあるサンプルをいくつかご紹介します。

  • VsCommandTarget : サンプル実装IOleCommandTarget
  • OleCommandUtilIOleCommandTarget : 渡されたデータを実際のコマンドとキーボード入力に変換するために使用されます
  • HostFactory : VSIX 拡張機能から に実際に接続IOleCommandTargetする方法の詳細。IVsTextView
于 2011-07-01T17:27:53.503 に答える
1

ReSharperのLiveTemplatesを基に構築することを検討します。マクロを使用して多くのことを実行し、単純な空欄を埋めるよりも拡張をインテリジェントにすることができます。私はその分野の専門家ではありませんが、この方法で作成されたかなり洗練されたテンプレートを見てきました。

于 2011-07-01T11:40:34.680 に答える
1

多分これが役立つかもしれません: http://resharperpowertoys.codeplex.com/wikipage?title=ZenCoding

ただし、ReSharper をプラグイン ホストとして使用します。

于 2011-07-01T09:59:02.670 に答える