Emacs 内部包含大量按键映射表,但在任意时刻只有少数映射表处于 活跃(active)状态。当 Emacs 接收用户输入时,会先对输入事件进行转换 (see 事件序列翻译键盘映射),然后在活跃按键映射表中查找对应的按键绑定。
通常情况下,活跃按键映射表按优先级顺序为:
(i) 由 keymap 属性指定的映射表,
(ii) 已启用的次模式的映射表,
(iii) 当前缓冲区的局部按键映射表,
(iv) 全局按键映射表。
Emacs 会在所有这些映射表中依次查找每个输入按键序列。
在上述常见映射表中,优先级最高的是光标位置处文本或覆盖层
的 keymap 属性指定的映射表(若存在)。
(对于鼠标输入事件,Emacs 使用事件位置而非光标位置;
see 搜索活跃按键映射表.)
次高优先级的是已启用次模式指定的按键映射表。
这些映射表(若存在)由变量
emulation-mode-map-alists、
minor-mode-overriding-map-alist
和 minor-mode-map-alist 指定。
See 控制活跃按键映射表。
再下一优先级是缓冲区的局部按键映射表(local keymap),
其中包含该缓冲区专属的按键绑定。小缓冲区同样拥有局部按键映射表
(see 迷你缓冲区简介)。
若光标位置存在 local-map 文本或覆盖层属性,
则该属性指定的映射表将替代缓冲区默认的局部映射表生效。
局部按键映射表通常由缓冲区的主模式设置,
同一主模式下的所有缓冲区共享同一份局部映射表。
因此,若在某个缓冲区中调用 keymap-local-set
(see 按键绑定相关命令)修改局部映射表,
会同时影响其他同主模式缓冲区的局部映射表。
最后,全局按键映射表(global keymap)包含与当前缓冲区无关的通用按键绑定,
例如 C-f。它始终处于活跃状态,并绑定到变量 global-map。
除上述常见映射表外,Emacs 还为程序提供了使其他映射表活跃的特殊方式。
其一,变量 overriding-local-map 指定一个映射表,
用于替换除全局映射表外的所有常规活跃映射表。
其二,终端局部变量 overriding-terminal-local-map
指定一个优先级高于所有其他映射表(包括 overriding-local-map)
的映射表;该变量通常用于模态/临时按键绑定(函数 set-transient-map
为此提供了便捷接口)。See 控制活跃按键映射表。
使映射表活跃并非使用它们的唯一方式。
按键映射表还可用于其他场景,例如在 read-key-sequence
内部对事件进行转换。See 事件序列翻译键盘映射。
部分标准按键映射表列表参见 See Standard Keymaps。
该函数返回当前环境下命令循环用于查找按键序列的活跃映射表列表。
通常它会忽略 overriding-local-map 和
overriding-terminal-local-map,
但若 olp 非 nil,则会将其纳入考虑。
position 可选为 event-start 返回的事件位置
或缓冲区位置,其作用与 keymap-lookup
(see keymap-lookup)中所述一致,
可能会改变所使用的映射表。