下面是一个定义菜单按键映射的完整示例。 它对应菜单栏中 ‘Edit’ 菜单下的 ‘Replace’ 子菜单, 并且使用了扩展菜单项格式(see 扩展菜单项)。 首先我们创建按键映射,并为其命名:
(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。
如果一个菜单包含两条分隔线,它们必须使用不同的按键符号。
下面代码将该菜单作为一项加入到父菜单中:
(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)