前缀键(prefix key)是一种按键序列,其绑定对象为一个按键映射表。
该映射表定义了在前缀键基础上继续输入的按键序列所对应的行为。
例如,C-x 是一个前缀键,它使用一个同样保存在变量 ctl-x-map
中的按键映射表。该映射表定义了所有以 C-x 开头的按键序列的绑定。
部分标准 Emacs 前缀键所使用的映射表同样可以通过 Lisp 变量访问:
esc-map 是 ESC 前缀键的全局按键映射表。因此,
所有元字符(meta character)的全局定义实际上都存放在这里。
该映射表同时也是函数 ESC-prefix 的函数定义。
help-map 是 C-h 前缀键的全局按键映射表。
mode-specific-map 是前缀键 C-c 的全局按键映射表。
该映射表实际是全局有效的,而非与具体主模式相关,但其名称能在
C-h b(display-bindings)的输出中为 C-c
提供有用的提示信息,因为该前缀键主要用于主模式专属绑定。
ctl-x-map 是 C-x 前缀键的全局按键映射表。
该映射表可通过符号 Control-X-prefix 的函数单元访问。
mule-keymap 是 C-x RET 前缀键的全局按键映射表。
ctl-x-4-map 是 C-x 4 前缀键的全局按键映射表。
ctl-x-5-map 是 C-x 5 前缀键的全局按键映射表。
2C-mode-map 是 C-x 6 前缀键的全局按键映射表。
tab-prefix-map 是 C-x t 前缀键的全局按键映射表。
vc-prefix-map 是 C-x v 前缀键的全局按键映射表。
goto-map 是 M-g 前缀键的全局按键映射表。
search-map 是 M-s 前缀键的全局按键映射表。
前缀键所绑定的按键映射表用于查找前缀键之后的输入事件。
(该绑定也可以是一个符号,其函数定义为一个按键映射表。效果相同,
只是该符号可作为此前缀键的名称。)因此,C-x 的绑定是符号
Control-X-prefix,其函数单元中保存着 C-x 系列命令的按键映射表。
(该映射表同时也是变量 ctl-x-map 的值。)
前缀键定义可以出现在任意活跃按键映射表中。 C-c、C-x、C-h 和 ESC 作为前缀键的定义 出现在全局映射表中,因此这些前缀键始终可用。 主模式和次模式可以在局部映射表或次模式映射表中为某个按键设置前缀键定义, 从而将其重新定义为前缀键。See 活跃按键映射表。
若一个按键在多个活跃映射表中均被定义为前缀键,则这些定义实际上会被合并: 次模式按键映射表中的定义优先级最高,其次是局部映射表中的前缀定义, 最后是全局映射表中的定义。
在下例中,我们在局部按键映射表中将 C-p 设置为前缀键,
使其行为与 C-x 完全一致。于是 C-p C-f 的绑定为函数
find-file,与 C-x C-f 相同。与之相对,按键序列
C-p 9 在任何活跃映射表中都不存在绑定。
(use-local-map (make-sparse-keymap))
⇒ nil
(keymap-local-set "C-p" ctl-x-map)
⇒ (keymap #^[nil nil keymap ...
(keymap-lookup nil "C-p C-f")
⇒ find-file
(keymap-lookup nil "C-p 9")
⇒ nil
该函数为 symbol 做好充当前缀键绑定的准备:
它会创建一个稀疏按键映射表,并将其设为 symbol 的函数定义。
之后将某按键序列绑定到 symbol 即可使该按键序列成为前缀键。
函数返回值为 symbol。
该函数同时会将 symbol 设置为变量,其值为上述按键映射表。
但若 mapvar 非 nil,则会将 mapvar 设为该映射表的变量名。
若 prompt 非 nil,则将其设为该按键映射表的整体提示字符串。
菜单按键映射表通常需要指定提示字符串(see 定义菜单)。