每个按键映射都是一个列表,其首个元素(CAR)为符号 keymap。
列表的其余元素定义了该按键映射的按键绑定。函数定义为按键映射的符号本身也属于按键映射。
可使用函数 keymapp(见下文)检测一个对象是否为按键映射。
在按键映射开头的 keymap 符号之后,可出现以下几种类型的元素:
(type . binding)该元素为 type 类型的事件指定一个绑定。每个普通绑定都适用于特定事件类型(event type)的事件, 事件类型始终是一个字符或符号(See 事件分类)。在此类绑定中,binding 是一个命令。
(type item-name . binding)该元素指定的绑定同时也是一个简单菜单项,会在菜单中显示为 item-name(See 简单菜单项)。
(type item-name help-string . binding)这是一个带有帮助字符串 help-string 的简单菜单项。
(type menu-item . details)该元素指定的绑定同时也是一个扩展菜单项,支持更多功能特性(See 扩展菜单项)。
(t . binding) ¶该元素指定默认按键绑定(default key binding):所有未被按键映射中其他元素绑定的事件,都会使用 binding 作为其绑定。
默认绑定允许按键映射无需枚举所有可能的事件类型,即可为所有事件类型设置绑定。
带有默认绑定的按键映射会完全遮蔽所有低优先级的按键映射,但显式绑定为 nil 的事件除外(见下文)。
char-table若按键映射的某个元素是字符表(char-table),则它会为所有无修饰位的字符事件提供绑定 (see modifier bits):索引为 c 的元素即为字符 c 的绑定。 这是一种紧凑记录大量绑定的方式。包含此类字符表的按键映射被称为完整按键映射(full keymap), 其他按键映射则称为稀疏按键映射(sparse keymap)。
vector此类元素与字符表类似:索引为 c 的元素即为字符 c 的绑定。 但由于这种方式能绑定的字符范围受向量大小限制,且创建向量时会为从 0 开始的所有字符码分配空间, 因此除创建菜单按键映射(see 菜单按键映射,其绑定本身无实际意义)外,不应使用该格式。
string ¶除指定按键绑定的元素外,按键映射还可包含字符串类型的元素。该字符串被称为整体提示字符串 (overall prompt string),使按键映射可被用作菜单(See 定义菜单)。
(keymap …)若按键映射的某个元素本身也是一个按键映射,则等效于将该内部按键映射内联到外部按键映射中。
这一机制用于实现多重继承,例如 make-composed-keymap 函数即采用此方式。
当绑定值为 nil 时,该元素不构成有效定义,但会优先于默认绑定或父映射中的绑定生效。
另一方面,值为 nil 的绑定不会覆盖低优先级的按键映射;
因此,若局部映射中某按键的绑定为 nil,Emacs 会使用全局映射中的对应绑定。
按键映射不会直接记录元字符(meta characters)的绑定。
在按键查找时,元字符会被视为两个字符组成的序列,第一个字符为 ESC
(或当前 meta-prefix-char 的值)。因此,按键 M-a 在内部会被表示为 ESC a,
其全局绑定可在 esc-map 中 a 对应的位置找到(See 前缀键)。
这种转换仅适用于字符,不适用于功能键或其他输入事件; 因此,M-end 与 ESC end 毫无关联。
以下是 Lisp 模式的局部按键映射示例(属于稀疏按键映射)。 它为 DEL、C-c C-z、C-M-q 和 C-M-x 定义了绑定 (实际值还包含一个菜单绑定,为简洁起见此处省略)。
lisp-mode-map ⇒
(keymap
(3 keymap
;; C-c C-z
(26 . run-lisp))
(27 keymap
;; C-M-x, treated as ESC C-x
(24 . lisp-send-defun))
;; This part is inherited from lisp-mode-shared-map.
keymap
;; DEL
(127 . backward-delete-char-untabify)
(27 keymap
;; C-M-q, treated as ESC C-q
(17 . indent-sexp)))
该函数在 object 为按键映射时返回 t,否则返回 nil。
更准确地说,该函数会检测对象是否为首个元素是 keymap 的列表,
或函数定义满足 keymapp 的符号。
(keymapp '(keymap))
⇒ t
(fset 'foo '(keymap))
(keymapp 'foo)
⇒ t
(keymapp (current-global-map))
⇒ t