为什么在终端中运行的Emacs无法区分Ctrl +;来自“;”?


8

这个问题源于我之前关于emacs beta的问题。简而言之,我想C-;在终端中绑定到Emacs函数,但是似乎有些东西在它到达Emacs之前就已经捕获了该键:Emacs认为我按下了;

显而易见的怀疑者是终端仿真器,但是我检查了其中的很多(xterm,gnome-terminal,terminator,术语),但它们都不起作用。很可能我可以排除窗口管理器,因为在Emacs的GUI版本中,该键C-;可以正常工作。我也尝试了两种不同的shell:bash和zsh,但同样没有成功。

我还能尝试什么?


根据您对Emacs的问题,按Ctrl +;。发送;到Emacs,因此没有捕获它,发生的是Ctrl +; 裸露; 发送相同的信息。是哪一个:捕获(即Emacs接收不到任何内容),或信息丢失(即Emacs接收到;)?
吉尔斯(Gillles)“所以-别再作恶了”

C-;在终端中没有标准代码。如果您输入C-v C-;普通bash会怎样?
artm 2014年

@Gilles我看到;emacs -nw我无关是否击中;C-;
WeSenseASoulInSearchOfAnswers

@artm bash就像emacs的打印一样;
WeSenseASoulInSearchOfAnswers 2014年

Answers:


11

也许您由于没有使用实际的终端而感到困惑。过去,当严肃的计算机只有几个立式冰箱的大小时,一个终端通过串行电缆与中央计算机通信,仅使用字符和字符。字符是某些标准化字符集的一部分,例如ASCII或EBCDIC,但通常是ASCII。ASCII具有33个控制字符,终端操作员通过按特殊键(例如DEL)或按住CTRL键并按另一个键来发送它们。中央计算机只能看到最终的控制字符。它不知道按下了哪个键来产生角色。

诸如xterm之类的终端仿真程序可以模拟该行为。终端仿真器提供了一种发送所有33个ASCII控制字符的方法,如果发送了这些字符,Emacs将接收这些字符。但是Emacs就像上面的描述中的中央计算机一样,它无法知道在终端仿真器下运行时实际按下了哪些键。因此,如果按CTRL和分号,除非终端仿真程序已将这些按键映射到某些ASCII字符,否则Emacs将不知道已键入任何内容。

终端仿真器通常使用以下映射来生成控制字符

按键ASCII
--------------------
逃脱27
删除127
后方空间8
CTRL +空格0
CTRL + @ 0
CTRL + A 1
CTRL + B 2
CTRL + C 3
等等...
CTRL + X 24
CTRL + Y 25
CTRL + Z 26
CTRL + [27
CTRL + \ 28
CTRL +] 29
CTRL + ^ 30
CTRL + _ 31

注意CTRL +; 没有出现在该列表中。如果CTRL + 未映射到控制字符,则终端通常只会发送分配给该的可打印字符。因此,您的终端模拟器通过发送来告诉您;仅是当您按CTRL +;时它不知道要做什么。

所有这一切仅在您使用终端或终端仿真程序时适用。如果您在某些窗口系统下将Emacs作为本机应用程序运行,则Emacs可以完全访问击键事件,而不仅仅是字符。因此Emacs可以看到您同时按下了CTRL和分号,并允许您为该按键对分配一个操作。

终端通常具有功能键和箭头键,它们还会生成包含控制字符的字符序列。这些序列通常以ASCII码27(ESCAPE)开头。


3

终端传输字符(更准确地说是字节),而不是键。当您按下键或类似Ctrl+ 的琴键时;,此信息必须被编码为字节序列。表示一个字符,像Keychords AShift+ AÀ,发送作为字符:aAà(最后一个是依赖于终端的字符编码的一个或两个字节)。

涉及功能键的键和弦没有相应的字符,因此它们以转义序列发送:以转义字符开头的字节序列(\e在Emacs字符串中,^[如果从字面上输入在缓冲区中则显示为青色)。一些功能键具有对应的字节,它们是控制字符

keychord Ctrl+ ;没有标准的转义序列,因此大多数终端仿真器都会生成character ;。这将丢失有关Ctrl按下修饰符的信息。

为了定义Ctrl+ 的绑定;,您需要配置终端仿真器以发送不同的转义序列。我认为您无法使用Gnome终端执行此操作(Gnome很少可配置)。您可以使用Xterm完成。请参阅是否有可以处理所有按键组合的linux终端?有关说明。

不涉及您可能在终端中运行的Shell。GUI Emacs没问题,因为GUI(X11)以编码键和修饰符的形式传输输入事件,而不仅仅是字符序列。

请参阅键盘输入和文本输出如何工作?详细了解如何从键盘到应用程序的输入。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.