以下に、メニューキーマップを定義する完全な例を示します。これは、メニューバーの‘Edit’メニュー内にある‘Replace’サブメニューの定義であり、拡張メニューアイテム形式(拡張メニューアイテムを参照)を使用しています。まず、キーマップを作成し、名前を付けます:
(defvar menu-bar-replace-menu (make-sparse-keymap "Replace"))
次に、メニュー項目を定義します:
(define-key menu-bar-replace-menu [tags-repl-continue]
'(menu-item "Continue Replace" multifile-continue
:help "Continue last tags replace operation"))
(define-key menu-bar-replace-menu [tags-repl]
'(menu-item "Replace in tagged files" tags-query-replace
:help "Interactively replace a regexp in all tagged files"))
(define-key menu-bar-replace-menu [separator-replace-tags]
'(menu-item "--"))
;; ...
バインディングの対象となっている記号に注意してください。これらの記号は、定義されるキーシーケンス内の角括弧の中に記述されます。場合によっては、この記号がコマンド名と同じであることもあれば、異なることもあります。これらの記号はファンクションキーとして扱われますが、キーボード上の実際のファンクションキーではありません。メニュー自体の動作に影響を与えることはありませんが、ユーザーがメニューから選択した際にエコー領域に反映され、where-is および apropos
の出力にも表示されます。
この例のメニューは、マウスでの操作を想定しています。メニューをキーボードで操作することを想定する場合、すなわち、キーボードイベントで終わるキーシーケンスに割り当てる場合は、メニュー項目を、キーボードで入力可能な文字や実際のファンクションキーに割り当てる必要があります。
定義が ("--")
であるバインディングは、区切り線です。実際のメニュー項目と同様に、区切り線にはキーシンボルがあり、この場合は separator-replace-tags
となります。1つのメニューに2つの区切り線がある場合、それらは異なる2つのキーシンボルを持つ必要があります。
このメニューを親メニューの項目として表示させる方法は以下の通りです。
(define-key menu-bar-edit-menu [replace] (list 'menu-item "Replace" menu-bar-replace-menu))
なお、ここではシンボル menu-bar-replace-menu そのものではなく、変数
menu-bar-replace-menu
の値であるサブメニューのキーマップが組み込まれている点に注意してください。親メニュー項目でこのシンボルを使用しても意味はありません。menu-bar-replace-menu はコマンドではないためです。
マウスクリックにも同じ置換メニューを紐付けたい場合は、次のようにできます。
(define-key global-map [C-S-down-mouse-1] menu-bar-replace-menu)