23.18.1.2 扩展菜单项

扩展格式的菜单项相比简单格式更灵活、更清晰。定义事件绑定时,使用以符号 menu-item 开头的列表即可。对于不可选中的纯文本项,绑定形式如下:

(menu-item item-name)

以两个或更多短横线开头的字符串表示分隔线,详见 菜单分隔线

若要定义可选中的实际菜单项,扩展格式绑定写法如下:

(menu-item item-name real-binding
    . item-property-list)

其中 item-name 是一个表达式,求值结果为菜单项显示字符串。因此该字符串不必是常量。

第三个元素 real-binding 可以是要执行的命令(此时为普通菜单项); 也可以是一个按键映射,这会生成子菜单,而 item-name 作为子菜单名称; 最后还可以是 nil,表示不可选中的菜单项,这在生成分隔线等场景时非常有用。

列表尾部的 item-property-list 为属性列表格式(see 属性列表),用于存放其他信息。

以下是支持的属性列表:

:enable form

form 求值的结果决定该项是否可用(非 nil 表示可用)。不可用时无法点击选中。

:visible form

form 求值的结果决定该项是否在菜单中显示(非 nil 表示显示)。不显示时,菜单效果如同该项未定义。

:help help

该属性值 help 指定鼠标悬停时显示的帮助提示字符串, 显示方式与 help-echo 文本属性相同(see Help display)。 注意该字符串必须是常量,这一点与文本和覆盖物的 help-echo 属性不同。

:button (type . selected)

该属性用于定义单选按钮和复选按钮。CAR 部分 type 为类型, 取值为 :toggle:radioCDR 部分 selected 是一个表达式,求值结果表示该按钮当前是否被选中。

复选按钮(toggle) 是一种根据 selected 值显示开启/关闭状态的菜单项。 命令本身应切换该状态:为 nil 时设为 t,为 t 时设为 nil。下面是切换 debug-on-error 标志的菜单项定义示例:

(menu-item "Debug on Error" toggle-debug-on-error
           :button (:toggle
                    . (and (boundp 'debug-on-error)
                           debug-on-error)))

该写法有效是因为 toggle-debug-on-error 被定义为切换变量 debug-on-error 的命令。

单选按钮(Radio buttons) 是一组菜单项,任何时刻仅有一项被选中。 通常由一个变量记录当前选中项。组内每个单选按钮的 selected 表达式用于判断变量是否为对应选中值。 点击按钮应修改变量,使当前点击项变为选中状态。

:key-sequence key-sequence

该属性指定作为键盘等价快捷键显示的按键序列。 Emacs 在菜单中显示 key-sequence 前会验证其确实与该菜单项等价, 因此只有正确的按键序列才会生效。将 key-sequence 设为 nil 等同于不使用该属性。

:keys string

该属性直接指定 string 作为菜单项的快捷键提示字符串。 可在 string 中使用 ‘\\[...]’ 文档结构。

该属性也可以是一个无参函数,执行后返回字符串。菜单每次刷新时都会调用该函数,因此不应使用耗时较长的函数,且需保证可在任意上下文安全调用。

:filter filter-fn

该属性支持动态计算菜单项绑定。属性值 filter-fn 为单参数函数,调用时参数为 real-binding,函数应返回实际使用的绑定。

Emacs 可能在任意重绘或操作菜单数据结构时调用该函数,因此需保证其可随时安全执行。

:wrap wrap-p

若在工具栏中 wrap-pnil,则该菜单项不显示,并使后续项换行显示。GTK+ 或 Nextstep 工具集不支持该属性。


emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike