几天前我了解到,我可以使用
"\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 键,有两种方法可以实现:
将其映射到 Escape (ASCII 033 / 0x1b) - 按下
Alt-K
实际上会发送"\ek"
,Alt-Shift-K
"\eK"
等。这是大多数终端仿真器中的默认设置,但它通常是可配置的,如果还没有,您有充分的理由将其设为默认值。打开该键的 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-meta
enable-meta-key
input-meta
即使你能做到这一点,那仍然会被破坏,因为人们可能实际上想要输入"ë"
和 ,"ó"
并且不会欣赏那些被处理为不相关的键,例如Alt-K
和Alt-S
。
答案2
你应该发现那\e
是这转义字符(意味着只有其中一个,字符代码 27,经常写成ESC
)而不是一个转义字符(表示多个字符之一)。
我认为在这种情况下,文档试图说它\e
代表 ESC 字符的一个实例,以便可以写入\e\e
两个 ESC 字符。
它不代表 ALT。