从键盘可以获取两种输入:普通按键和功能键。 普通按键对应(可能带修饰的)字符;它们产生的事件在 Lisp 中以字符表示。 字符事件(character event) 的事件类型就是字符本身(一个整数),其中可能设置了某些修饰位; 参见 事件分类。
输入字符事件由一个介于 0 到 524287 之间的 基础编码(basic code), 以及下列任意或全部 修饰位(modifier bits) 组成:
字符编码中的 2**27 位表示输入字符时按住了 Meta 键。
字符编码中的 2**26 位表示非 ASCII 控制字符。
ASCII 控制字符(如 C-a)有自己专用的基础编码, 因此 Emacs 不需要用特殊位来表示它们。 于是,C-a 的编码就是 1。
但如果你输入 ASCII 中没有的控制组合, 比如按住 Control 键再按 %, 得到的数值就是 % 的编码加上 2**26 (前提是终端支持非 ASCII 控制字符), 也就是第 27 位被置位。
字符事件编码中的 2**25 位(第 26 位)表示输入 ASCII 控制字符时按住了 Shift 键。
对于字母,基础编码本身就区分大小写; 对于数字和标点,Shift 键会选择具有不同基础编码的完全不同字符。 为了尽可能保持在 ASCII 字符集内, Emacs 对这类字符事件避免使用 2**25 位。
但是 ASCII 无法区分 C-A 和 C-a, 因此 Emacs 在 C-A 中使用 2**25 位,而在 C-a 中不使用。
字符事件编码中的 2**24 位表示输入字符时按住了 Hyper 键。
字符事件编码中的 2**23 位表示输入字符时按住了 Super 键。
字符事件编码中的 2**22 位表示输入字符时按住了 Alt 键。 (大多数键盘上标为 Alt 的按键实际上被当作 Meta 键,而非此键。)
程序中最好避免提及具体的位编号。
要检测字符的修饰位,请使用函数 event-modifiers(see 事件分类)。
使用 keymap-set 设置按键绑定时,
你可以改用类似 ‘C-H-x’ 这样的字符串来指定这些事件(表示“Control+Hyper+x”)
(see 修改按键绑定)。