22.8.3 输入事件的修改与转换

Emacs 在从 read-event 返回事件之前,会先根据 extra-keyboard-modifiers 修改它读取的每个事件,然后通过 keyboard-translate-table 进行转换(如适用)。

Variable: extra-keyboard-modifiers

该变量允许 Lisp 程序在键盘上“虚拟按下”修饰键。其值是一个字符,只有字符的修饰位有效。 每当用户按下一个键盘按键时,该按键会被修改,如同那些修饰键被按住一样。 例如,如果你将 extra-keyboard-modifiers 绑定为 ?\C-\M-a, 那么在该绑定作用域内输入的所有键盘字符都会被附加 Control 和 Meta 修饰。 字符 ?\C-@(等价于整数 0)在此处不算作控制字符,而是视为不带任何修饰的字符。 因此,将 extra-keyboard-modifiers 设置为 0 会取消所有修饰。

在窗口系统下,程序可以通过这种方式虚拟按下任意修饰键。 否则,只能虚拟按下 CTLMETA 键。

注意,该变量仅对真正来自键盘的事件生效,对鼠标事件或其他任何事件没有影响。

Variable: keyboard-translate-table

这个终端局部变量是键盘字符的转换表。它允许你在不修改任何命令绑定的情况下重新映射键盘按键。 其值通常是一个字符表(char-table),否则为 nil。 (它也可以是字符串或向量,但这已被视为过时用法。)

如果 keyboard-translate-table 是一个字符表(see 字符表), 那么从键盘读取的每个字符都会在此字符表中查找。 如果查找到的值非 nil,则使用该值代替实际输入的字符。

注意,这种转换是字符从终端读取后发生的第一件事。 像 recent-keys 和日志文件这类记录功能会保存转换之后的字符。

还要注意,该转换发生在字符被交给输入法处理之前(see Input Methods)。 如果你希望在输入法处理之后再转换字符,请使用 translation-table-for-input (详见 see Translation of Characters)。

Function: key-translate from to

该函数修改 keyboard-translate-table,将字符编码 from 转换为字符编码 to。 如有必要,它会创建键盘转换表。fromto 都应该是满足 key-valid-p 的字符串(see 按键序列)。如果 tonil, 该函数会删除 from 已有的任何转换。

下面是一个使用 keyboard-translate-tableC-xC-cC-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), 必须使用那里描述的事件转换机制。


emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike