23.11 按键查找函数

以下是与按键查找相关的函数与变量。

Function: keymap-lookup keymap key &optional accept-defaults no-remap position

该函数返回 keykeymap 中的绑定定义。本章中所有其他用于查找按键的函数均基于 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 为非 nilkeymap-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-startevent-end 返回的鼠标位置,此时查找将在该位置关联的按键映射中进行,而非 keymapposition 也可以是数字或标记,此时会被解释为缓冲区位置,函数将使用该位置而非光标处的按键映射属性。

Command: undefined

用于在按键映射中取消按键的定义。该函数会调用 ding,但不会抛出错误。

Function: keymap-local-lookup key &optional accept-defaults

该函数返回 key 在当前局部按键映射中的绑定,若未定义则返回 nil

参数 accept-defaults 用于控制是否检查默认绑定,规则与 keymap-lookup(见上文)一致。

Function: keymap-global-lookup key &optional accept-defaults

该函数返回 key 在当前全局按键映射中的绑定,若未定义则返回 nil

参数 accept-defaults 用于控制是否检查默认绑定,规则与 keymap-lookup(见上文)一致。

Function: minor-mode-key-binding key &optional accept-defaults

该函数返回 key 所有生效的次要模式绑定构成的列表。更精确地说,返回由 (modename . binding) 组成的关联列表,其中 modename 是启用该次要模式的变量,bindingkey 在该模式下的绑定。 若 key 无次要模式绑定,则返回 nil

若找到的首个绑定并非前缀定义(按键映射或定义为按键映射的符号),则会忽略后续其他次要模式的绑定, 因其会被完全遮蔽。同理,列表也会忽略位于前缀绑定之后的非前缀绑定。

参数 accept-defaults 用于控制是否检查默认绑定,规则与 keymap-lookup(见上文)一致。

User Option: meta-prefix-char

该变量为 Meta 前缀字符编码,用于将 Meta 字符转换为双字符序列,以便在按键映射中查找。 为获得可用结果,其值应设为前缀事件(see 前缀键)。默认值为 27,即 ESCASCII 编码。

只要 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


emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike