23.9 控制活跃按键映射表

Variable: global-map

该变量保存默认的全局按键映射表,负责将 Emacs 键盘输入映射到命令。 全局映射表通常就是该映射表。默认全局映射表是一个完整映射表, 它将 self-insert-command 绑定到所有可打印字符。

修改全局映射表中的绑定是常见做法,但不应该给该变量赋予初始映射表以外的值。

Function: current-global-map

该函数返回当前全局按键映射表。除非你修改其中某一个, 否则它与 global-map 的值相同。 返回值是引用而非副本;若对其使用 keymap-set 或其他函数, 会直接修改全局按键绑定。

(current-global-map)
⇒ (keymap [set-mark-command beginning-of-line ...
            delete-backward-char])
Function: current-local-map

该函数返回当前缓冲区的局部按键映射表,若无则返回 nil。 下例展示了 *scratch* 缓冲区(使用 Lisp Interaction 模式) 的映射表是一个稀疏映射表,其中 ESC(ASCII 码 27)对应的条目是另一个稀疏映射表。

(current-local-map)
⇒ (keymap
    (10 . eval-print-last-sexp)
    (9 . lisp-indent-line)
    (127 . backward-delete-char-untabify)
    (27 keymap
        (24 . eval-defun)
        (17 . indent-sexp)))

current-local-map 返回的是局部映射表的引用而非副本; 若对其使用 keymap-set 等函数,会直接修改局部绑定。

Function: current-minor-mode-maps

该函数返回当前已启用次模式的按键映射表列表。

Function: use-global-map keymap

该函数将 keymap 设置为新的当前全局按键映射表。返回 nil

修改全局映射表的情况非常少见。

Function: use-local-map keymap

该函数将 keymap 设置为当前缓冲区新的局部按键映射表。 若 keymapnil,则该缓冲区不再拥有局部映射表。 use-local-map 返回 nil。大多数主模式命令都会使用该函数。

Variable: minor-mode-map-alist

该变量是一个关联列表,描述根据某些变量的值决定是否活跃的按键映射表。 其元素格式如下:

(variable . keymap)

只要 variable 的值非 nilkeymap 就处于活跃状态。 通常 variable 是用于启用或禁用某个次模式的变量。See 按键映射与次要模式

注意 minor-mode-map-alist 的元素结构与 minor-mode-alist 不同。 映射表必须是元素的 CDR;以映射表为第二个元素的普通列表无效。 CDR 可以是一个按键映射表(列表),也可以是一个函数定义为按键映射表的符号。

当多个次模式映射表同时活跃时,minor-mode-map-alist 中靠前的元素优先级更高。 但你在设计次模式时应避免相互冲突,这样顺序便不再重要。

有关次模式的更多信息,参见 按键映射与次要模式。 另请参见 minor-mode-key-binding(see 按键查找函数)。

Variable: minor-mode-overriding-map-alist

该变量允许主模式覆盖特定次模式的按键绑定。 其元素格式与 minor-mode-map-alist 相同:(variable . keymap)

如果某个变量同时出现在本列表与 minor-mode-map-alist 中, 本列表中指定的映射表会完全替换后者中同一变量对应的映射表。

minor-mode-overriding-map-alist 在所有缓冲区中自动成为局部变量。

Variable: overriding-local-map

若该变量非 nil,它保存的按键映射表将替代缓冲区局部映射表、 任何文本属性或覆盖层映射表以及所有次模式映射表生效。 如果指定该映射表,它会覆盖原本活跃的所有其他映射表,全局映射表除外。

Variable: overriding-terminal-local-map

若该变量非 nil,它保存的映射表优先级高于 overriding-local-map、 局部映射表、文本/覆盖层映射表以及所有次模式映射表。

该变量始终是当前终端局部的,不能设为缓冲区局部。See Multiple Terminals。 它用于实现增量搜索模式。

Variable: overriding-local-map-menu-flag

若该变量非 niloverriding-local-mapoverriding-terminal-local-map 会影响菜单栏显示。 默认值为 nil,因此这些映射表变量对菜单栏无影响。

注意即使不影响菜单栏显示,这两个映射表变量依然会影响通过菜单栏输入的按键序列执行。 因此当菜单栏按键事件到来时,应在查找并执行前清空这些变量。 使用这些变量的模式通常都会这样处理:它们对无法处理的事件执行“反读”并退出。

Variable: special-event-map

该变量保存用于特殊事件的按键映射表。 如果某类事件在该映射表中有绑定,则它属于特殊事件, 其绑定会由 read-event 直接运行。See 特殊事件

Variable: emulation-mode-map-alists

该变量保存一组用于模拟模式的按键映射表关联列表。 适用于使用多个次模式映射表的模式或包。 每个元素都是一个格式与含义同 minor-mode-map-alist 的映射表关联列表, 或是一个变量值为此类列表的符号。 每个列表中的活跃映射表优先级高于 minor-mode-map-alistminor-mode-overriding-map-alist

Function: set-transient-map keymap &optional keep-pred on-exit message timeout

该函数将 keymap 添加为临时(transient)按键映射表, 使其在接下来一次或多次按键时优先级高于其他映射表。

默认情况下,keymap 只使用一次,用于查找下一个按键。 若可选参数 keep-predt,则只要用户输入该映射表中定义的按键, 映射表就保持活跃;当用户输入一个不在该映射表 keymap 中的按键时,临时映射表被禁用, 并对该按键继续执行正常查找流程。

keep-pred 也可以是一个函数。这种情况下,在 keymap 活跃期间, 每次执行命令前都会调用该无参函数;若返回非 nil,则保持 keymap 活跃。

可选参数 on-exit 若非 nil,指定一个无参函数, 在 keymap 被禁用后执行。

可选参数 message 指定激活临时映射表后显示的提示信息。 若为字符串,则作为提示信息的格式串,其中 ‘%k’ 会被替换为临时映射表中的按键列表。 其他非 nilmessage 值表示使用默认格式 ‘Repeat with %k’。

若可选参数 timeoutnil,应为一个数字, 指定在空闲多少秒后禁用 keymap。 变量 set-transient-map-timeout 的值(若非 nil)会覆盖该参数。

该函数的实现方式是在变量 overriding-terminal-local-map 中添加或移除 keymap,该变量优先级高于所有其他活跃映射表(see 搜索活跃按键映射表)。


emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike