前回でコマンドを増やすことができましたので、これらのコマンドをサブメニューの中に入れたいと思います。
公式サイトの「サブメニューを追加する」をみると
- 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>
こうしてメンバから要望のあったサブメニュー化、コンテキストメニュー化が実現できて、めでたく社内公開できました。