xterm 在原始输入上报告错误的转义序列

问题描述

我目前正在尝试在 Linux 中进行原始输入(例如,我通常会使用 ncurses 或类似的东西)。

我已经知道每个按键都会直接报告给我的应用程序,并被转储为一系列十六进制代码

如果我按键盘上的“a”键,我会得到以下输出

 #  hex string
00 0x61 'a'

这很直接。 0x61 是 ASCII 'a' 的十六进制代码,我可以反过来使用 (char) 0x61 将其打印回控制台。

现在我正在尝试进行基本的行编辑。例如,如果我使用 xterm 按下左箭头键,则会得到以下输出

 #  hex string
00 0x1B '\x1b'
01 0x5B '['
02 0x44 'D'

According to this website,在“键盘处理”部分,

左箭头 [...] 发送的代码可以表示为 kcub1

根据termcap文件,序列应该x1b O D

 ~ infocmp xterm | grep kcub1
kcub1=\EOD

虽然这发生在 xtermtermite 中,但它不会在认的 tty 或 urxvt 中发生。

根据xterm faq

转义序列 [...] 被选为“PC 风格”代码(如 SCO“ansi”),即,

ESC [ H
ESC [ F

对于普通模式,和

ESC O H
ESC O F

用于游标应用模式

我想我要么将 xterm 设置为“正常模式”,要么将 termcap 文件中的所有 O 替换为“[”?

阅读箭头键以支持 xterm 和非 xterm 终端的理想方式是什么?

然后,还有 cub 功能

cub=\E[%p1%dD

On the same page,还有一节是关于“参数化字符串”的。 我想这就是 cub 功能中的 %p1%d 所指的吗?

%p1 指的是“push first parm”,%d 指的是“print pop() as in printf”。

这一切意味着什么?什么被推到了哪里?我在任何时候都不会调用 pop(),第二个选项是什么意思?

提前感谢您的帮助。

编辑:Here is a small C program 说明了我在说什么。如果我使用 gcc kilo.c 编译并运行它,按左箭头键会发出 27 91 ('[') 68 ('D')。注意左括号而不是预期的 O

解决方法

终端描述的特殊键列表假设应用程序已将终端初始化为全屏模式,使用应用程序模式作为特殊键而不是初始的普通模式。命令行应用程序通常不会这样做(它们当然可以:查找 smkxrmkx)。

进一步阅读: