以下是与按键查找相关的函数与变量。
该函数返回 key 在 keymap 中的绑定定义。本章中所有其他用于查找按键的函数均基于
keymap-lookup 实现。示例如下:
(keymap-lookup (current-global-map) "C-x C-f")
⇒ find-file
(keymap-lookup (current-global-map) "C-x C-f 1 2 3 4 5")
⇒ 2
若字符串或向量 key 并非 keymap 中前缀按键所定义的有效按键序列,则说明该按键过长, 末尾存在不属于单个按键序列的多余事件。此时返回值为一个数字,表示 key 前端可构成完整按键的事件数量。
若 accept-defaults 为非 nil,keymap-lookup 会同时考虑默认绑定与 key
中具体事件的绑定;否则仅报告 key 对应序列的绑定,忽略默认绑定,除非显式指定(可在 key
中传入 t,详见 按键映射的格式)。
若 key 包含 Meta 字符(非功能键),该字符会被隐式转换为双字符序列:meta-prefix-char
的值后接对应的非 Meta 字符。因此下面第一个示例会被转换为第二个示例处理。
(keymap-lookup (current-global-map) "M-f")
⇒ forward-word
(keymap-lookup (current-global-map) "ESC f")
⇒ forward-word
参数 keymap 可为 nil,表示在当前生效的按键映射中查找 key(由 current-active-maps
返回,see 活跃按键映射表);也可以是单个按键映射或按键映射列表,表示仅在指定映射中查找。
与 read-key-sequence 不同,该函数不会以丢弃信息的方式修改指定事件(see 读取按键序列)。
具体而言,它不会将字母转为小写,也不会将拖拽事件改为点击事件。
与常规命令循环一致,keymap-lookup 会通过在当前按键映射中再次查找,对查找到的命令执行重映射。
但若可选第三个参数 no-remap 为非 nil,则直接返回原始命令而不进行重映射。
若可选参数 position 为非 nil,它指定一个由 event-start 与 event-end
返回的鼠标位置,此时查找将在该位置关联的按键映射中进行,而非 keymap。position
也可以是数字或标记,此时会被解释为缓冲区位置,函数将使用该位置而非光标处的按键映射属性。
用于在按键映射中取消按键的定义。该函数会调用 ding,但不会抛出错误。
该函数返回 key 在当前局部按键映射中的绑定,若未定义则返回 nil。
参数 accept-defaults 用于控制是否检查默认绑定,规则与 keymap-lookup(见上文)一致。
该函数返回 key 在当前全局按键映射中的绑定,若未定义则返回 nil。
参数 accept-defaults 用于控制是否检查默认绑定,规则与 keymap-lookup(见上文)一致。
该函数返回 key 所有生效的次要模式绑定构成的列表。更精确地说,返回由 (modename . binding)
组成的关联列表,其中 modename 是启用该次要模式的变量,binding 是 key 在该模式下的绑定。
若 key 无次要模式绑定,则返回 nil。
若找到的首个绑定并非前缀定义(按键映射或定义为按键映射的符号),则会忽略后续其他次要模式的绑定, 因其会被完全遮蔽。同理,列表也会忽略位于前缀绑定之后的非前缀绑定。
参数 accept-defaults 用于控制是否检查默认绑定,规则与 keymap-lookup(见上文)一致。
该变量为 Meta 前缀字符编码,用于将 Meta 字符转换为双字符序列,以便在按键映射中查找。 为获得可用结果,其值应设为前缀事件(see 前缀键)。默认值为 27,即 ESC 的 ASCII 编码。
只要 meta-prefix-char 保持为 27,按键查找就会将 M-b 转换为 ESC b,
该组合通常绑定为 backward-word 命令。但若将其设为 24(即 C-x 的编码),Emacs 会将
M-b 转换为 C-x b,其标准绑定为 switch-to-buffer 命令。(切勿实际执行此操作!)
示例如下:
meta-prefix-char ; The default value.
⇒ 27
(key-binding "\M-b")
⇒ backward-word
?\C-x ; The print representation ⇒ 24 ; of a character.
(setq meta-prefix-char 24)
⇒ 24
(key-binding "\M-b")
⇒ switch-to-buffer ; Now, typing M-b is
; like typing C-x b.
(setq meta-prefix-char 27) ; Avoid confusion!
⇒ 27 ; Restore the default value!
这种单事件转双事件的转换仅对字符生效,不适用于其他类型的输入事件。因此 M-F1 这类功能键 不会被转换为 ESC F1。