Emacs 在从 read-event 返回事件之前,会先根据 extra-keyboard-modifiers
修改它读取的每个事件,然后通过 keyboard-translate-table 进行转换(如适用)。
该变量允许 Lisp 程序在键盘上“虚拟按下”修饰键。其值是一个字符,只有字符的修饰位有效。
每当用户按下一个键盘按键时,该按键会被修改,如同那些修饰键被按住一样。
例如,如果你将 extra-keyboard-modifiers 绑定为 ?\C-\M-a,
那么在该绑定作用域内输入的所有键盘字符都会被附加 Control 和 Meta 修饰。
字符 ?\C-@(等价于整数 0)在此处不算作控制字符,而是视为不带任何修饰的字符。
因此,将 extra-keyboard-modifiers 设置为 0 会取消所有修饰。
在窗口系统下,程序可以通过这种方式虚拟按下任意修饰键。 否则,只能虚拟按下 CTL 和 META 键。
注意,该变量仅对真正来自键盘的事件生效,对鼠标事件或其他任何事件没有影响。
这个终端局部变量是键盘字符的转换表。它允许你在不修改任何命令绑定的情况下重新映射键盘按键。
其值通常是一个字符表(char-table),否则为 nil。
(它也可以是字符串或向量,但这已被视为过时用法。)
如果 keyboard-translate-table 是一个字符表(see 字符表),
那么从键盘读取的每个字符都会在此字符表中查找。
如果查找到的值非 nil,则使用该值代替实际输入的字符。
注意,这种转换是字符从终端读取后发生的第一件事。
像 recent-keys 和日志文件这类记录功能会保存转换之后的字符。
还要注意,该转换发生在字符被交给输入法处理之前(see Input Methods)。
如果你希望在输入法处理之后再转换字符,请使用 translation-table-for-input
(详见 see Translation of Characters)。
该函数修改 keyboard-translate-table,将字符编码 from 转换为字符编码 to。
如有必要,它会创建键盘转换表。from 和 to 都应该是满足 key-valid-p
的字符串(see 按键序列)。如果 to 为 nil,
该函数会删除 from 已有的任何转换。
下面是一个使用 keyboard-translate-table 让 C-x、C-c 和 C-v
执行剪切、复制和粘贴操作的示例:
(key-translate "C-x" "<control-x>") (key-translate "C-c" "<control-c>") (key-translate "C-v" "<control-v>") (keymap-global-set "<control-x>" 'kill-region) (keymap-global-set "<control-c>" 'kill-ring-save) (keymap-global-set "<control-v>" 'yank)
在支持扩展 ASCII 输入的图形终端上,你仍然可以通过按住 Shift 键来输入这些字符, 以获得它们标准的 Emacs 含义。就键盘转换而言,这样得到的是不同的字符, 但通常具有相同的原有含义。
关于在 read-key-sequence 层面转换事件序列的机制,see 事件序列翻译键盘映射。
如果你需要转换非字符的输入事件(即对其调用 characterp 返回 nil),
必须使用那里描述的事件转换机制。