也许您由于没有使用实际的终端而感到困惑。过去,当严肃的计算机只有几个立式冰箱的大小时,一个终端通过串行电缆与中央计算机通信,仅使用字符和字符。字符是某些标准化字符集的一部分,例如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)开头。
;
到Emacs,因此没有捕获它,发生的是Ctrl +; 裸露; 发送相同的信息。是哪一个:捕获(即Emacs接收不到任何内容),或信息丢失(即Emacs接收到;
)?