VSコマンドとショートカットキーの一覧表をVS IDE内に表示する
ここまで、VSコマンドとショートカットキー割り当てに関するオブジェクト、その基本的な使い方についての説明をしてきました。
さて、せっかく一覧表を作成できるほどの情報が取得できるのですから、今現在設定されているショートカットキーの状態をVS IDEに表示できるようにしてみましょう。
VSマクロには、ユーザーに対しての入出力機能がほとんどありません。アドインのように独自のフォームを持って入力を受け付けたり、処理結果を表示したりすることができないのです。VSマクロは通常VS IDEの持つエディタなどに対して出力を行いますが、出力結果を編集できる状態になるのは避けたいところです。
そこで今回は、出力ファイルをXHTML形式とし、そのファイルを直接VS IDEのひとつのタブとして表示してみます。
'*** VSコマンド一覧表の出力(3) *********************************** ' 1. [Guid、ID、Name、Localname、Bindings → XHTML]をVS IDEに表示 '***************************************************************** Public Sub GetCommandList3() '*** [Guid、ID、Name、Localname、Bindings]を取得 ' ※ 取得した時点で[使用する場所]-[コマンド名(英名)]順にソートされている Dim VSCommandList As Collections.SortedList = fGetCommandListSort() '*** 取得したデータをXHTMLファイルとして出力 Call OutputCommandsAsHTML(VSCommandList) '*** XHTMLファイルをVS IDEに表示 Call DispShortCutList() End Sub
特に難しいことをしているわけではありませんが、XHTMLファイルの出力部分が、かなり力まかせのコードで読みにくいので、3つのパートに分けてみました。
VSコマンドの情報を取得する「fGetCommandListSort」(今までの説明の応用例です)、取得した情報をXHTMLファイルとして出力する「OutputCommandsAsHTML」、出力したXHTMLファイルをVS IDEのタブとして表示させる「DispShortCutList」です。
fGetCommandListSort:VSコマンドの情報を取得する
'****************************************** ' VSコマンドとショートカットキー情報の取得 '****************************************** Private Function fGetCommandListSort() As Collections.SortedList '*** VSコマンド情報(返値用ワーク) Dim sl As New Collections.SortedList '*** VSコマンドのCSV出力 For Each cmd As Command In DTE.Commands 'NameまたはLocalizedNameが空でなければ取得対象 If cmd.Name <> "" AndAlso cmd.LocalizedName <> "" Then 'ショートカットが割り当たっていたら取得対象 If Not cmd.Bindings Is Nothing _ AndAlso cmd.Bindings.GetLength(0) > 0 Then 'VSコマンド情報を取得 Dim VSCommandMem As VSCommandMemDef VSCommandMem.Guid = cmd.Guid VSCommandMem.ID = cmd.ID VSCommandMem.Name = cmd.Name VSCommandMem.LocalizedName = cmd.LocalizedName For i As Integer = 0 To cmd.Bindings.GetLength(0) - 1 VSCommandMem.Bindings = cmd.Bindings(i) 'キー文字列の生成(ここを変更すると任意の順にソートできる) Dim vd As String = VSCommandMem.Bindings Dim slKey As String = vd.Substring(0, vd.IndexOf("::")) _ & New String(" ", 50) & VSCommandMem.Name _ & vd.Substring(vd.IndexOf("::") + 2) 'ソートコレクションへの追加 sl.Add(slKey, VSCommandMem) Next Else 'ショートカットキーが割り当てられていないVSコマンドは取得しない End If End If Next Return sl End Function
最終的には、現在使っているVS IDEのショートカットキーの割り当て状態を表示したいので、ショートカットキーを割り当てていないVSコマンドは情報を取得しないようにしています。
また、SortedListコレクションを使って、VSコマンドの情報の取得と同時にソートがかかるようにしました。
どのように並べられた状態で参照したいかは、参照する方の好みや状況によってさまざまなパターンが考えられますが、今回は[オプション]ダイアログの「使用する場所」別・コマンド名(英名)順でキーを作ってあります。これは、MSDN Libraryの「既定のショートカットキー」ページとほぼ同等の分類基準です。
ショートカットキーの情報はBindingsプロパティの中に「テキスト エディタ::Ctrl+K, Ctrl+A」のように、[(使用する場所)::(第1ストローク)[,(第2ストローク)]]の形式で格納されています。キーの作成に当たっては、「::」をセパレータに、それ以前を「使用する場所」、それ以降を「割り当てられているショートカットキー」として使用しました。
SortedListコレクションの値には、応用しやすいように構造体「VSCommandMemDef」の形で格納してあります。
OutputCommandsAsHTML:取得した情報をXHTMLファイルとして出力する
このサブプロシージャは、XHTMLファイルとして整形出力するための機能です。単なる力まかせのコードで、技術的なトピックはありませんので、ソースの提示は割愛します。
cssは本来別ファイルにすべきなのですが、今回は出力ファイル数を抑えたかったので、XHTMLファイルの中に埋め込んでいます。
見出しの部分にVSのエディションを表示させるようにしてありますが、Team Editionの場合は「Enterprise」と表示されます。これは、Team Editionが各種アドインを追加して販売上呼び分けているエディションであり、システム自体はEnterprise Editionであるためと思われます。
DispShortCutList:出力したXHTMLファイルをVS IDEのタブとして表示させる
'********************************* ' XHTMLファイル → VS IDEへの表示 '********************************* Public Sub DispShortCutList() '*** VS IDEへの表示 ' ※ VS2005とそれ以前ではIDEにWebページを表示させるVSコマンドが異なる If CInt(DTE.Version) < 8 Then DTE.ExecuteCommand("View.URL", XHTML_PATH) Else DTE.ExecuteCommand("View.WebBrowser", XHTML_PATH) End If End Sub
ここまで、VS .NET 2003とVS 2005のどちらでも、修正や振り分けが必要ない単一のコードで動作するように留意しながら記述していたのですが、とうとうここで力尽きました。
VS IDEにWebページを表示させるVSコマンドが、VS .NET 2003までは「View.URL」だったのですが、VS 2005から「View.WebBrowser」に変更になってしまっており、この違いを吸収することができなかったのです。
仕方がないので、DTE.VersionでVSのバージョン情報を取得し、2005(8.0)以降と、それ以前で使用するVSコマンドを振り分けるようにしました。
VSコマンドの取得から出力までにけっこう時間がかかるので、このサブプロシージャをPublicとし、単体でVS IDEからも実行できるようにしました。ショートカットキーの割り当てを変更していない場合は、DispShortCutListを直接実行させることで高速に一覧表を表示できます。
まとめ
今回は、VS IDEをカスタマイズできる最も手軽な機能「VSマクロ」を使って、現行のIDEに不満な部分をフォローするというアプローチを紹介しました。
より多機能・高性能なフォローを実装するテクノロジーとしては、アドインやVSIPなどがありますが、実務以外の時間を作りにくい現場技術者の方が短時間で開発環境を改善したい場合には、VSマクロも十分有効な選択肢ではないでしょうか。
今回は言及できませんでしたが、VSマクロはVS IDEに連動するイベントプロシージャを作成することもできます。機会がありましたら、そのあたりも紹介してみたいと思います。
