Next: 菜单栏, Previous: 菜单与键盘, Up: 菜单按键映射   [Contents][Index]


23.18.4 菜单示例 ¶

下面是一个定义菜单按键映射的完整示例。 它对应菜单栏中 ‘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)