工具栏(tool bar)是位于框架顶部、菜单栏正下方的一行可点击图标。 See Tool Bars in The GNU Emacs Manual。 在图形界面下,Emacs 默认显示工具栏。
在每个框架中,框架参数 tool-bar-lines 控制为工具栏预留的行数高度。
值为 0 时隐藏工具栏。若该值非零且 auto-resize-tool-bars 非 nil,
工具栏会根据内容自动伸缩高度。若值为 grow-only,
工具栏仅自动扩展,不自动收缩。
工具栏内容由绑定到虚拟功能键 TOOL-BAR 的菜单按键映射控制
(与菜单栏的控制方式类似)。
因此你可以使用 define-key 定义工具栏项,写法如下:
(define-key global-map [tool-bar key] item)
其中 key 是用于区分不同项的虚拟功能键, item 是菜单项按键绑定(see 扩展菜单项), 用于指定该项的显示方式与行为。
常用的菜单映射项属性 :visible、:enable、:button
和 :filter 在工具栏绑定中同样有效,语义保持不变。
项中的 real-binding 必须是命令,而非按键映射;
换言之,不能将工具栏图标定义为前缀键。
:help 属性指定鼠标悬停时显示的提示字符串,
其显示方式与 help-echo 文本属性相同(see Help display)。
此外,你应当使用 :image 属性指定工具栏中显示的图像:
:image imageimage 可以是单个图像描述(see Images), 也可以是包含四个图像描述的向量。 若使用四元素向量,Emacs 会根据状态选择其中一个:
项启用且被选中时使用。
项启用但未被选中时使用。
项禁用且被选中时使用。
项禁用且未被选中时使用。
基于 GTK+ 和 NS 版本的 Emacs 会忽略第 1–3 项, 因为禁用与未选中状态的图像会从第 0 项自动生成。
若 image 是单个图像描述, Emacs 会对图像应用边缘检测算法,绘制禁用状态的工具栏按钮。
:rtl 属性指定用于从右到左书写语言的替代图像。
目前仅 GTK+ 版本的 Emacs 支持该属性。
部分工具库会在工具栏同时显示图像与文本。
若希望强制只显示图像,可将 :vert-only 属性设为非 nil。
与菜单栏类似,工具栏也支持分隔线(see 菜单分隔线)。
不过工具栏分隔线是垂直方向的,且仅支持一种样式。
它们在工具栏映射中以 (menu-item "--") 条目表示;
工具栏分隔线不支持 :visible 等属性。
在 GTK+ 和 Nextstep 工具栏中,分隔线由系统原生绘制;
其他环境下则使用竖线图像绘制。
默认工具栏的定义规则为:
若某个主模式的命令符号拥有 mode-class 属性且值为 special,
则不显示与编辑相关的默认工具栏项(see 主模式编码规范)。
主模式可以在局部映射中绑定 [tool-bar foo],
向全局工具栏添加项。
由于工具栏空间有限,部分主模式完全替换默认工具栏项是合理的;
默认绑定通过 tool-bar-map 间接实现,方便替换。
默认情况下,全局映射对 [tool-bar] 的绑定如下:
(keymap-global-set "<tool-bar>"
`(menu-item ,(purecopy "tool bar") ignore
:filter tool-bar-make-keymap))
函数 tool-bar-make-keymap 会根据变量 tool-bar-map 的值
动态生成实际的工具栏映射。
因此,你通常应通过修改该映射来调整默认(全局)工具栏。
Info 模式等部分主模式会将 tool-bar-map 设为缓冲区局部变量,
并赋值为其他映射,从而完全替换全局工具栏。
Emacs 提供三个便捷函数用于定义工具栏项,如下所示。
该函数通过修改 tool-bar-map 向工具栏添加一项。
icon 为图像基名,对应 XPM、XBM 或 PBM 格式文件,
由 find-image 查找。例如传入 ‘"exit"’,
彩色显示器上会按顺序查找 exit.xpm、exit.pbm、exit.xbm。
单色显示器上查找顺序为 ‘.pbm’、‘.xbm’、‘.xpm’。
def 为绑定的命令,key 为前缀映射中的虚拟功能键符号。
剩余参数 props 为添加到菜单项描述中的附加属性列表。
若要在局部映射中定义项,可在调用该函数时用 let 绑定 tool-bar-map:
(defvar foo-tool-bar-map
(let ((tool-bar-map (make-sparse-keymap)))
(tool-bar-add-item ...)
...
tool-bar-map))
该函数用于便捷定义与现有菜单栏绑定一致的工具栏项。
它会在 map(默认为 global-map)的菜单栏中查找 command 的绑定,
并为其添加 icon 对应的图像描述(查找规则同 tool-bar-add-item)。
生成的绑定会放入 tool-bar-map,因此该函数仅用于全局工具栏项。
map 必须包含绑定到 [menu-bar] 的有效映射。
剩余参数 props 为添加到菜单项描述中的附加属性。
该函数用于定义非全局的工具栏项。
用法与 tool-bar-add-item-from-menu 类似,
区别在于 in-map 指定要在其中创建定义的局部映射。
参数 from-map 对应 tool-bar-add-item-from-menu 的 map。
除了 tool-bar-map 中定义的工具栏项,
Emacs 还支持在按键映射 secondary-tool-bar-map 中指定额外一行 “次级(secondary”)” 工具栏项。
若工具栏位于框架顶部,这些项通常显示在主工具栏下方;
若工具栏位于底部,则显示在主工具栏上方(see Layout Parameters)。
若工具栏位于框架左侧或右侧,则不显示次级项。
若该变量非 nil,工具栏会自动调整大小以显示所有定义的项,
但高度不超过框架高度的四分之一。
若值为 grow-only,工具栏仅自动扩展,不自动收缩。
用户需输入 C-l 重绘框架,才能使工具栏收缩。
若 Emacs 使用 GTK+ 或 Nextstep 编译,工具栏仅支持单行显示, 该变量无效。
若该变量非 nil,鼠标悬停时工具栏项会呈现凸起效果。
该变量指定工具栏项周围的额外边距,单位为像素,默认值为 4。
该变量指定工具栏项的阴影宽度,单位为像素,默认值为 1。
该变量指定工具栏区域下方绘制的边框高度,为整数像素值。
若值为 internal-border-width(默认)或 border-width,
工具栏边框高度对应相应的框架参数。
你可以为按住 Shift、Control、Meta 等修饰键点击工具栏项定义特殊行为。 方法是通过虚拟功能键为原项创建关联的附加项。 具体来说,附加项应使用原项同名虚拟功能键的修饰版本。
例如,原项定义如下:
(define-key global-map [tool-bar shell]
'(menu-item "Shell" shell
:image (image :type xpm :file "shell.xpm")))
则可如下定义按住 Shift 键点击同一图标时的行为:
(define-key global-map [tool-bar S-shell] 'some-command)
有关为功能键添加修饰键的更多信息,参见 See 功能键。
若你有函数会动态修改工具栏项的启用/禁用状态,
界面上不一定会立即刷新。
若要强制重新计算工具栏,可调用 force-mode-line-update(see 模式行格式)。