阅读"编写GNU Emacs Extensions"的第一章后,我对emacs中的键和键绑定之间的区别感到有些困惑。 (O' Reilly书)。
本章首先注意到在某些emacs版本中,键退格和DEL,调用帮助菜单而不是删除。换句话说,它们调用C-h调用的内容。
然后本章继续介绍如何使用Lisp代码更改此行为。这是通过将击键C-h绑定到删除命令来完成的。
这对我来说有点混乱。在我看来,DEL,Backspace和C-h是三种不同的击键(前两个由单个键组成)。
为什么重新映射C-h会影响DEL和Backspace的作用?
我本来想改变退格所做的事情,例如,你会将退格重新映射到另一个命令,而不是按键C-h。
答案 0 :(得分:3)
除非由低级键盘驱动程序重新映射,否则Backspace键的作用是发送带有数字代码8的字符,在某些操作系统中,这与按Control-h生成的代码完全相同。您只需在unix(或linux)shell上编写任何内容然后按Backspace和Control-h即可验证这一事实:它们都具有擦除前一个字符的效果,因为具有数字代码8的字符由操作解释system作为控制字符BS,退格,用于擦除打印的最后一个字符或叠加它(见wikipedia)。类似地,Control-J等同于RETURN键等。 同一维基百科页面将DEL描述为“最初打算成为被忽略的角色,但现在在某些系统中用于擦除角色”。
因此,当您为击键分配命令时,实际上是在为字符代码分配命令,如果两个或多个键生成相同的代码,按下它们就会调用相同的命令。
答案 1 :(得分:0)
@Renzo回答了关于这些密钥如何相关以及如何绑定一个人似乎影响另一个密钥的问题。以下是有关此特定情况的更多信息。
请参阅Emacs手册,节点DEL Does Not Delete。
在解释问题/混淆之后,你会看到这个:
要解决每个Emacs会话中的问题,请执行以下操作之一 将行放入初始化文件中(* note Init File::)。为了第一 如果上面的情况,BACKSPACE删除前进而不是后退,使用 这一行使BACKSPACE充当DEL:
(normal-erase-is-backspace-mode 0)
对于其他两种情况,请使用以下行:
(normal-erase-is-backspace-mode 1)
解决每个Emacs会话问题的另一种方法是 自定义变量
normal-erase-is-backspace
:值t
指定BS或BACKSPACE为DEL的模式,nil
指定其他模式。 *注意轻松定制::。
另请参阅GNU Emacs FAQ question about Backspace invoking help。在那里,您将看到除了上述类似的信息之外,有关如何在UNIX上重新映射DEL
的信息 - 使用此:
stty erase '^?'
Wrt C-j
和RET
(问题中未提及,但在@ Renzo的回答中提及):Emacs的默认行为在大多数编程模式中都发生了变化,在Emacs 24.4中。
从该版本开始,默认情况下会启用electric--indent-mode
,这意味着RET
会插入换行符和缩进,而C-j
只会插入换行符。在该版本发布之前,这些密钥具有相反的行为。如果您更喜欢旧的行为,请执行此操作,以关闭electric-indent-mode
:
(when (fboundp 'electric-indent-mode)
(electric-indent-mode -1)) ; Use classic `C-j' and `RET'.