ncurses - 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'
根据这个网站,在“键盘处理”部分,
左箭头 [...] 发送的代码可以给出为
kcub1
。
根据 termcap 文件,顺序应该是x1b O D
:
~ infocmp xterm | grep kcub1
kcub1=\EOD
虽然这发生在xterm和termite中,但它不会在默认的 tty 或urxvt中。
转义序列 [...] 被选为“PC 风格”代码(如 SCO“ansi”),即
ESC [ H ESC [ F
对于正常模式,和
ESC O H ESC O F
用于光标应用模式
我想我必须将 xterm 设置为“正常模式”或将 termcap 文件中的所有 O 替换为“[”?
阅读箭头键以支持 xterm 和非 xterm 终端的最佳方式是什么?
然后,还有cub
能力:
cub=\E[%p1%dD
在同一页上,还有一个关于“参数化字符串”的部分。我想这就是%p1%d
in the cub 能力所指的?
%p1
指“push first parm”,%d
指“print pop() as in printf”。
这是什么意思呢?什么被推到哪里?我在任何时候都不会调用 pop() ,第二个选项是什么意思?
感谢您提前提供任何帮助。
编辑:这是一个小 C 程序,演示了我在说什么。如果我使用它编译gcc kilo.c
并运行它,按左箭头键会发出27 91 ('[') 68 ('D')
. 注意左括号而不是预期的O
.
解决方案
终端描述的特殊键列表是假设应用程序已将终端初始化为全屏模式,使用特殊键的应用程序模式而不是初始正常模式。命令行应用程序通常不这样做(它们当然可以:查找smkx
and rmkx
)。
进一步阅读:
我的光标键在 ncurses 中不起作用
为什么我不能在(无论如何)shell 中使用光标键?在 xterm 常见问题解答中
推荐阅读
- docker - 如何让 docker 网络中的应用程序与外部的应用程序通信
- python - 如何在python中的数据帧上使用条件过滤器
- sql - 使用带有连接语句 sql 的 case 子句
- vector - 无法组合两个不同的mbtile
- iterm2 - macOS Mojave 更新后 - iterm 和 zsh 损坏
- linux - 如何通过比较文件名和文件夹名来将文件复制到同名文件夹?
- java - 在属性文件中忽略 Java 日志记录级别
- javascript - 带有 Firebase 实时数据库的 GoogleMap - Javascript
- php - Wordpress 如何将 wp_post 记录转换为页面?
- swagger - 模型 OpenAPI 2.0 文件下载,类型字符串:二进制与类型文件