一个按键映射表(keymap)可以继承另一个按键映射表的绑定关系,我们将后者称为 父按键映射表(parent keymap)。这类按键映射表的结构如下:
(keymap elements... . parent-keymap)
其作用是,该按键映射表会继承 parent-keymap 的所有绑定关系(无论按键查询时 这些绑定关系具体是什么),同时可通过 elements 新增绑定关系或覆盖原有绑定。
若你使用 keymap-set 或其他按键绑定函数修改 parent-keymap 中的绑定关系,
这些修改后的绑定会在继承该映射表的子映射表中生效——除非被 elements 定义的绑定
关系覆盖。反之则不成立:若使用 keymap-set 修改继承方按键映射表的绑定关系,
这些变更仅会记录在 elements 中,不会对 parent-keymap 产生任何影响。
构建带父映射表的按键映射表的规范方式是使用 set-keymap-parent;若你的代码中
存在直接构造带父映射表的按键映射表的逻辑,请将程序修改为使用 set-keymap-parent
实现。
该函数返回 keymap 的父按键映射表。若 keymap 无父映射表,
keymap-parent 返回 nil。
该函数将 keymap 的父按键映射表设置为 parent,并返回 parent。
若 parent 为 nil,则该函数会移除 keymap 的所有父映射表。
若 keymap 包含子映射表(即前缀键的绑定关系),这些子映射表也会获得新的父按键映射表, 且新父映射表会遵循 parent 为这些前缀键指定的配置。
以下示例展示如何创建一个继承自 text-mode-map 的按键映射表:
(let ((map (make-sparse-keymap))) (set-keymap-parent map text-mode-map) map)
非稀疏按键映射表(non-sparse keymap)也可拥有父映射表,但这一用法实用价值不高。
非稀疏按键映射表会为所有无修饰位的数字字符编码显式指定绑定关系(即便绑定值为 nil),
因此这些字符的绑定关系永远不会从父按键映射表继承。
有时你需要创建一个从多个映射表继承的按键映射表,可通过函数 make-composed-keymap
实现这一需求。
该函数返回一个由已有按键映射表(一个或多个)maps 组合而成的新映射表,
该新映射表可选择性地从父按键映射表 parent 继承绑定关系。maps 可以是单个
按键映射表,也可以是包含多个映射表的列表。在新映射表中查询按键时,Emacs 会依次遍历
maps 中的每个映射表,再查询 parent,并在找到第一个匹配项时停止。
若 maps 中任意一个映射表对某按键的绑定值为 nil,该值会覆盖 parent
中对应的绑定关系,但不会覆盖 maps 中其他映射表的非 nil 绑定。
例如,以下代码展示了 Emacs 如何设置 help-mode-map 的父映射表,
使其同时从 button-buffer-map 和 special-mode-map 继承:
(defvar-keymap help-mode-map
:parent (make-composed-keymap button-buffer-map
special-mode-map)
...)