前回でコマンドを増やすことができましたので、これらのコマンドをサブメニューの中に入れたいと思います。
公式サイトの「サブメニューを追加する」をみると
- vsctファイルを開いて
- IDSymbolを追加して
- Menusセクションにサブメニュー用のMenuを追加して
- GroupsセクションにGroupを追加して
- Buttonsセクションにサブメニューコマンド用のButtonを追加しろ
と書いてあります。
実は社内用の拡張機能を作った際にはこの部分でひっかかり、1,2ヵ月放置していました。
この公式ページの説明どおりにTopLevelMenuという名前のVSPackageを作って、説明どおりにIDSymbolやらMenuやらを追加すれば良かったのですが、説明を斜め読みのまま、
- VSPackage1という名前で作ったプロジェクトのvsctファイルの内容を書き換えよう。
- とりあえずIDSymbleを追加。
- MenusセクションへのMenu追加はコピペしてguidを書き換えよう。
- GroupsセクションのGroupを書き換えよう。
- 最後のコマンド用Buttonは既に作ったコマンドのParentのidを書き換えて使おう。
ってな感じで進めた結果、まったくサブメニュー化できませんでした。
どこを間違えていたかというと、GroupsセクションにGroupを追加する部分です。「追加」しなければいけないのですが、説明ページの内容に置き換えてしまったわけです。
<Groups>
<Group guid="guidVSPackage1CmdSet" id="MyMenuGroup" priority="0x0600">
<Parent guid="guidSHLMainMenu" id="IDM_VS_MENU_TOOLS"/>
</Group>
</Groups>
これを
<Groups>
<Group guid="guidVSPackage1CmdSet" id="MyMenuGroup" priority="0x0600">
<Parent guid="guidSHLMainMenu" id="IDM_VS_MENU_TOOLS"/>
</Group>
<Group guid="guidVSPackage1CmdSet" id="SubMenuGroup" priority="0x0000">
<Parent guid="guidVSPackage1CmdSet" id="SubMenu"/>
</Group>
</Groups>
こうしないといけませんでした。
ちなみにid=”SubMenu”はMenuなのでこんな感じです。
<Menus>
<Menu guid="guidVSPackage1CmdSet" id="SubMenu" priority="0x0100" type="Menu">
<Parent guid="guidVSPackage1CmdSet" id="MyMenuGroup"/>
<Strings>
<ButtonText>Sub Menu</ButtonText>
<CommandName>Sub Menu</CommandName>
</Strings>
</Menu>
</Menus>
で、各コマンド用ButtonのParentをid=”SubMenuGroup”に変更します。
<Button guid="guidVSPackage1CmdSet" id="cmdidMyCommand" priority="0x0100" type="Button">
<Parent guid="guidVSPackage1CmdSet" id="SubMenuGroup" />
<Icon guid="guidImages" id="bmpPic1" />
<Strings>
<ButtonText>My Command name</ButtonText>
</Strings>
</Button>
- メニュー「ツール」の中にサブメニュー(id=”SubMenu”)を配置するために必要なのがParentを id=”IDM_VS_MENU_TOOLS” にしたGroup(id=”MyMenuGroup”)。
- サブメニューの中にコマンドを配置するために必要なのがParentを id=”SubMenu”にしたGroup(id=”SubMenuGroup”)。
- 配置するコマンドのParentはGroup(id=”SubMenuGroup”)にする。
サブメニューを親にしてコマンド配置用のGroupを作らないといけないんですね。よく読まずにコマンドの親をそのままサブメニューにしていたためにサブメニュー化できずに放置していました。
こうしてめでたくサブメニューになりました。
同じようにMenuやGroup、Buttonをもうワンセット作成し、一番上の親になるGroupのParentを以下のようにすればコンテキストメニューへ追加も完了です。
<Parent guid="guidSHLMainMenu" id="IDM_VS_CTXT_CODEWIN"/>
ショートカットキーの設定は簡単でKeyBindingsセクションにKeyBindingを追加してidに目的のコマンドIDを指定するだけです。修飾キーとして使えるものは入力補完で表示されます。
<KeyBindings>
<KeyBinding guid="guidVSPackage1CmdSet" id="cmdidMyCommand" editor="guidVSStd97" key1="M" mod1="Control Shift" key2="A" mod2="Control Shift" />
<KeyBinding guid="guidVSPackage1CmdSet" id="cmdidMyCommand2" editor="guidVSStd97" key1="M" mod1="Control Shift" key2="B" mod2="Control Shift" />
</KeyBindings>
こうしてメンバから要望のあったサブメニュー化、コンテキストメニュー化が実現できて、めでたく社内公開できました。

