23.1 按键映射基础

按键映射(keymap)是一种 Lisp 数据结构,用于为各类按键序列指定 按键绑定 (key binding)。

单个按键映射会直接为独立的事件定义绑定规则。当一个按键序列仅包含单个事件时, 其在该按键映射中的绑定关系,就是此按键映射针对该事件的定义。更长按键序列的绑定 关系则通过迭代过程查找:首先查找第一个事件的定义(该定义本身必须是一个按键映射); 接着在这个按键映射中查找第二个事件的定义,以此类推,直至处理完该按键序列中的所有事件。

若某个按键序列的绑定对象是一个按键映射,我们便称该按键序列为 前缀键 (prefix key)。反之,则称其为 完整键(complete key)(因为无法再为其添加更多事件)。 若绑定值为 nil,则称该按键为 未定义键(undefined key)。前缀键的示例有 C-cC-xC-x 4。已定义的完整键示例有 XRETC-x 4 C-f。 未定义的完整键示例有 C-x C-gC-c 3。See 前缀键

查找按键序列绑定关系的规则有一个前提:中间绑定(为最后一个事件之前的所有事件找到的绑定) 必须均为按键映射;若该前提不成立,则该事件序列无法构成一个独立单元——它并非真正意义上的 单个按键序列。换言之,从任意合法按键序列的末尾移除一个或多个事件后,得到的结果必须始终是 一个前缀键。例如,C-f C-n 并非合法按键序列;因为 C-f 不是前缀键,所以以 C-f 开头的更长序列也无法成为合法按键序列。

可用的多事件按键序列集合取决于前缀键的绑定关系;因此,不同按键映射对应的可用序列可能不同, 且当绑定关系发生变更时,该集合也会随之改变。但单事件序列始终是合法按键序列,因为其有效性 不依赖任何前缀键。

在任意时刻,都会有若干个主按键映射处于 激活(active)状态——即正用于查找按键绑定的状态。 这些映射包括:全局映射(global map),由所有缓冲区共享;局部按键映射(local keymap), 通常与特定的主模式关联;以及零个或多个 次要模式按键映射(minor mode keymaps), 归属于当前启用的次要模式(并非所有次要模式都有对应的按键映射)。局部按键映射的绑定会遮蔽 (即优先级高于)对应的全局绑定,而次要模式按键映射则会同时遮蔽局部和全局按键映射。 See 活跃按键映射表

emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike