23.18.6 工具栏

工具栏(tool bar)是位于框架顶部、菜单栏正下方的一行可点击图标。 See Tool Bars in The GNU Emacs Manual。 在图形界面下,Emacs 默认显示工具栏。

在每个框架中,框架参数 tool-bar-lines 控制为工具栏预留的行数高度。 值为 0 时隐藏工具栏。若该值非零且 auto-resize-tool-barsnil, 工具栏会根据内容自动伸缩高度。若值为 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 image

image 可以是单个图像描述(see Images), 也可以是包含四个图像描述的向量。 若使用四元素向量,Emacs 会根据状态选择其中一个:

第 0 项

项启用且被选中时使用。

第 1 项

项启用但未被选中时使用。

第 2 项

项禁用且被选中时使用。

第 3 项

项禁用且未被选中时使用。

基于 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 间接实现,方便替换。

Variable: 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 提供三个便捷函数用于定义工具栏项,如下所示。

Function: tool-bar-add-item icon def key &rest props

该函数通过修改 tool-bar-map 向工具栏添加一项。 icon 为图像基名,对应 XPM、XBM 或 PBM 格式文件, 由 find-image 查找。例如传入 ‘"exit"’, 彩色显示器上会按顺序查找 exit.xpmexit.pbmexit.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))
Function: tool-bar-add-item-from-menu command icon &optional map &rest props

该函数用于便捷定义与现有菜单栏绑定一致的工具栏项。 它会在 map(默认为 global-map)的菜单栏中查找 command 的绑定, 并为其添加 icon 对应的图像描述(查找规则同 tool-bar-add-item)。 生成的绑定会放入 tool-bar-map,因此该函数仅用于全局工具栏项。

map 必须包含绑定到 [menu-bar] 的有效映射。 剩余参数 props 为添加到菜单项描述中的附加属性。

Function: tool-bar-local-item-from-menu command icon in-map &optional from-map &rest props

该函数用于定义非全局的工具栏项。 用法与 tool-bar-add-item-from-menu 类似, 区别在于 in-map 指定要在其中创建定义的局部映射。 参数 from-map 对应 tool-bar-add-item-from-menumap

除了 tool-bar-map 中定义的工具栏项, Emacs 还支持在按键映射 secondary-tool-bar-map 中指定额外一行 “次级(secondary”)” 工具栏项。 若工具栏位于框架顶部,这些项通常显示在主工具栏下方; 若工具栏位于底部,则显示在主工具栏上方(see Layout Parameters)。 若工具栏位于框架左侧或右侧,则不显示次级项。

Variable: auto-resize-tool-bars

若该变量非 nil,工具栏会自动调整大小以显示所有定义的项, 但高度不超过框架高度的四分之一。

若值为 grow-only,工具栏仅自动扩展,不自动收缩。 用户需输入 C-l 重绘框架,才能使工具栏收缩。

若 Emacs 使用 GTK+ 或 Nextstep 编译,工具栏仅支持单行显示, 该变量无效。

Variable: auto-raise-tool-bar-buttons

若该变量非 nil,鼠标悬停时工具栏项会呈现凸起效果。

Variable: tool-bar-button-margin

该变量指定工具栏项周围的额外边距,单位为像素,默认值为 4。

Variable: tool-bar-button-relief

该变量指定工具栏项的阴影宽度,单位为像素,默认值为 1。

Variable: tool-bar-border

该变量指定工具栏区域下方绘制的边框高度,为整数像素值。 若值为 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 模式行格式)。


emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike