Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Emacs:击键和键之间的关系_Emacs_Key Bindings_Backspace - Fatal编程技术网

Emacs:击键和键之间的关系

Emacs:击键和键之间的关系,emacs,key-bindings,backspace,Emacs,Key Bindings,Backspace,在阅读了“编写GNU emacs扩展”(O'Reilly书)的第一章之后,我对emacs中键和键绑定之间的差异有点困惑 本章首先指出,在某些emacs版本中,键backspace和DEL调用帮助菜单,而不是删除。换句话说,它们调用C-h调用的内容 本章接着说明如何使用Lisp代码更改此行为。这是通过将击键C-h绑定到delete命令来完成的 这让我有点困惑。在我看来,Backspace和C-h是三种不同的按键(前两种由一个键组成) 为什么重新映射C-h会影响DEL和Backspace的作用 我会

在阅读了“编写GNU emacs扩展”(O'Reilly书)的第一章之后,我对emacs中键和键绑定之间的差异有点困惑

本章首先指出,在某些emacs版本中,键backspace和DEL调用帮助菜单,而不是删除。换句话说,它们调用C-h调用的内容

本章接着说明如何使用Lisp代码更改此行为。这是通过将击键C-h绑定到delete命令来完成的

这让我有点困惑。在我看来,Backspace和C-h是三种不同的按键(前两种由一个键组成)

为什么重新映射C-h会影响DEL和Backspace的作用


我会想更改backspace的功能,例如,您将backspace重新映射到另一个命令,而不是击键C-h

除非由低级键盘驱动程序重新映射,否则退格键的作用是发送带有数字代码8的字符,在某些操作系统中,数字代码8与按Control-h生成的代码完全相同。您只需在unix(或linux)shell上写入任何内容,然后按Backspace和Control-h即可验证这一事实:它们都具有删除前一个字符的效果,因为带有数字代码8的字符被操作系统解释为控制字符BS,Backspace,用于擦除最后打印的字符或将其套印(请参阅)。类似地,Control-J相当于返回键等。 同一个维基百科页面将DEL描述为“最初打算作为一个被忽略的字符,但现在在一些系统中用于删除字符”


因此,当您将命令分配给击键时,实际上是将命令分配给字符代码,如果两个或多个键生成相同的代码,则通过按它们,您将调用相同的命令。

@Renzo回答了您关于这些键如何相关以及绑定一个键如何影响另一个键的问题。下面是关于这个特殊案例的更多信息

请参阅Emacs手册,节点

在这里,您将看到以下内容,并对问题/混淆进行了解释:

要解决每个Emacs会话中的问题,请执行以下操作之一 初始化文件(*注意初始化文件::)中的行。第一次 在上述情况下,如果BACKSPACE向前而不是向后删除,请使用 此行用于使退格充当DEL:

 (normal-erase-is-backspace-mode 0)
对于其他两种情况,请使用以下行:

 (normal-erase-is-backspace-mode 1)
解决每个Emacs会话问题的另一种方法是 自定义变量
normalerase is backspace
:值
t
指定BS或BACKSPACE为DEL和
nil的模式
指定其他模式*注意:轻松定制::

另请参见GNU Emacs。除了上面类似的信息外,您还将看到有关如何在UNIX上重新映射
DEL
的信息-使用以下方法:

stty erase '^?'

Wrt
C-j
RET
(问题中未提及,但在@Renzo的回答中提及):在大多数编程模式中,Emacs的默认行为都发生了变化,在Emacs 24.4中

从该版本开始,
electric--indent模式默认打开,这意味着
RET
插入换行符和缩进,而
C-j
仅插入换行符。在发布之前,这些键具有相反的行为。如果您喜欢旧的行为,请执行此操作,以关闭电缩进模式

(when (fboundp 'electric-indent-mode)
  (electric-indent-mode -1)) ; Use classic `C-j' and `RET'.

我明白了,这是有道理的!后续问题:在一些版本的emacs中,RETURN调用新行和缩进,而C-J只调用新行。如何才能将两个不同的命令分配给(正如您所断言的)本质上相同的字符代码?如果它们生成相同的字符代码,我认为这是不可能的,除非您在操作系统级别以其他方式重新映射它们。还请注意,在Emacs接收到的键代码方面存在显著差异,在终端中运行Emacs和将其作为GUI应用程序运行之间。GUI Emacs有机会区分终端中无法区分的许多键序列。是的,我认为你们都是对的。我的emacs版本在GUI中运行,我想这就是为什么它在C-j和RETURN上的行为不同。