CodeZine(コードジン)

特集ページ一覧

Visual Studioコマンドとショートカットキーの対応表を作成する

Visual Studioマクロの実践とXHTMLによる結果出力手法

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2006/05/31 00:00
目次

VSコマンドとショートカットキーの一覧表をVS IDE内に表示する

 ここまで、VSコマンドとショートカットキー割り当てに関するオブジェクト、その基本的な使い方についての説明をしてきました。

 さて、せっかく一覧表を作成できるほどの情報が取得できるのですから、今現在設定されているショートカットキーの状態をVS IDEに表示できるようにしてみましょう。

 VSマクロには、ユーザーに対しての入出力機能がほとんどありません。アドインのように独自のフォームを持って入力を受け付けたり、処理結果を表示したりすることができないのです。VSマクロは通常VS IDEの持つエディタなどに対して出力を行いますが、出力結果を編集できる状態になるのは避けたいところです。

 そこで今回は、出力ファイルをXHTML形式とし、そのファイルを直接VS IDEのひとつのタブとして表示してみます。

VSコマンド一覧表の出力(3)
'*** 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コマンドとショートカットキー情報の取得
'******************************************
' 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への表示
'*********************************
' 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に連動するイベントプロシージャを作成することもできます。機会がありましたら、そのあたりも紹介してみたいと思います。

  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • さるべーじ(サルベージ)

    札幌在住のフリーランスプログラマ。専門はVB、VBA。 プログラミング初心者にエールを送りたく、blog猿頁で日々VBのうんちくを語っている。 北海道の.NETコミュニティCLR/Hメンバー。 Microsoft MVP for VB(Jul 2005-Jun 2007)。 著書にこれからは...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5