扩展格式的菜单项相比简单格式更灵活、更清晰。定义事件绑定时,使用以符号 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 或 :radio。
CDR 部分 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-p 非 nil,则该菜单项不显示,并使后续项换行显示。GTK+ 或 Nextstep 工具集不支持该属性。