实际记录在哪里,“\e”代表 .inputrc 中的 Alt 键

实际记录在哪里,“\e”代表 .inputrc 中的 Alt 键

几天前我了解到,我可以使用

"\ej": history-search-backward
"\ek": history-search-forward

为了避免使用箭头键。现在,虽然这就像一个魅力,但我开始阅读 bash 文档以了解有关 .inputrc 的更多信息。请查看此页面(尤其是有关键绑定的部分。) https://www.gnu.org/software/bash/manual/html_node/Readline-Init-File-Syntax.html#Readline-Init-File-Syntax \e 被称为“转义字符”。虽然英语不是我的母语,但我绝不会认为这可以用来映射 Alt。这是我和文档正在进行的一个计划。对我来说,它们更像是示范性的,而不是解释性的。问题是:这些内容实际上写在哪里,以便其他人可以首先了解并提供提示?

答案1

Alt键到Escape(ASCII 033, )的映射"\e"是由终端仿真器完成的,readline 库(处理~/.inputrc)不参与其中。

问题是无法将实际的按键事件发送到终端中运行的程序;终端会将它们转换为程序可以从 tty 读取的字节序列。

对于 Alt/Meta 键,有两种方法可以实现:

  1. 将其映射到 Escape (ASCII 033 / 0x1b) - 按下Alt-K实际上会发送"\ek",Alt-Shift-K "\eK"等。这是大多数终端仿真器中的默认设置,但它通常是可配置的,如果还没有,您有充分的理由将其设为默认值。

  2. 打开该键的 ASCII 值的高 7 位——按下Alt-K将实际发送该0x6b | 0x80 = 0xeb字节,0x6b即 的 ASCII 值"k"

后者"\M-k"在 readline 绑定中被识别。

确实如此不是en_US.UTF-8工作并且与任何多字节语言环境(这是大多数现代系统上的默认设置)一起严重破坏。在此类系统上,终端仿真器可能不会发送原始0xeb字节(这不是有效的 UTF-8 序列,而是二进制垃圾),但可能会将其从 ISO-8859-1 转换为 UTF-8,从而导致"\xc3\xab" = "ë"(e带有分音符)Alt-K按下时发送。

但是 readline 不知道如何映射"ë"回,无论您如何摆弄诸如、、等"\M-k"众多选项。convert-metaenable-meta-keyinput-meta

即使你能做到这一点,那仍然会被破坏,因为人们可能实际上想要输入"ë"和 ,"ó"并且不会欣赏那些被处理为不相关的键,例如Alt-KAlt-S

答案2

你应该发现那\e转义字符(意味着只有其中一个,字符代码 27,经常写成ESC)而不是一个转义字符(表示多个字符之一)。

我认为在这种情况下,文档试图说它\e代表 ESC 字符的一个实例,以便可以写入\e\e两个 ESC 字符。

它不代表 ALT。

相关内容