WeS*_*ers 9 keyboard-shortcuts terminal-emulator terminal emacs
这个问题来自我之前关于 emacs beta 的问题。简而言之,我想绑定C-;到终端中的 Emacs 函数,但似乎有些东西在到达 Emacs 之前捕获了这个键:Emacs 认为我按下了;。
明显的嫌疑人是终端模拟器,但我已经检查了其中的许多(xterm、gnome-terminal、终结者、术语),但没有一个有效。很可能我可以排除窗口管理器,因为在 Emacs 的 GUI 版本中,键C-;工作得很好。我还尝试了两种不同的 shell:bash 和 zsh,但还是没有成功。
我还能尝试什么?
Kyl*_*nes 12
也许您的困惑源于没有使用实际的终端。当真正的计算机有几个立式冰箱那么大时,终端通过串行电缆与中央计算机通信,仅使用字符和字符。这些字符是一些标准化字符集的一部分,例如 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) 开头。
终端传输字符(更准确地说:字节),而不是键。Ctrl当您按下某个键或像+这样的键和弦时;,该信息必须编码为字节序列。表示字符的键和弦,如A或Shift+A或\xc3\x80,作为该字符发送:a, A, \xc3\xa0(最后一个是一个或两个字节,具体取决于终端的字符编码)。
涉及功能键的按键没有对应的字符,因此它们作为转义序列发送:以转义字符开头的字节序列(\\e在 Emacs 字符串中,^[如果在缓冲区中逐字输入,则显示为青色)。一些功能键有相应的字节,这些字节是控制字符。
键和键Ctrl+;没有标准转义序列,因此大多数终端模拟器都会生成字符;。Ctrl这会丢失按下修改器的信息。
为了定义Ctrl+的绑定;,您需要配置终端模拟器以发送不同的转义序列。我不认为你可以用 Gnome 终端来做到这一点(Gnome 很少是可配置的)。您可以使用 Xterm 来完成。请参阅是否有可以处理所有组合键的 Linux 终端?以获得指示。
\n\n不涉及您可能在终端中运行的 shell。GUI Emacs 没有问题,因为 GUI (X11) 以编码键和修饰符的形式传输输入事件,而不仅仅是字符序列。
\n\n请参阅键盘输入和文本输出如何工作?有关输入如何从键盘传输到应用程序的更多详细背景信息。
\n