xterm 在原始输入上报告错误的转义序列
xterm reports wrong escape sequences on raw input
我目前正在尝试在 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,在“键盘处理”部分,
The codes sent by the left arrow [...] can be given as kcub1
.
根据termcap文件,序列应该是x1b O D
:
~ infocmp xterm | grep kcub1
kcub1=\EOD
虽然这在 xterm 和 termite 中都会发生,但在默认 tty 或 urxvt.
根据 xterm faq
escape sequences [...] were chosen as "PC-style" codes (like SCO "ansi"), i.e.,
ESC [ H
ESC [ F
for normal mode, and
ESC O H
ESC O F
for cursor application mode
我想我要么将 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
.
终端描述的特殊键列表假设应用程序已将终端初始化为全屏模式,使用应用程序模式特殊键而不是初始普通模式。命令行应用程序通常不会这样做(当然,它们可以:查找 smkx
和 rmkx
)。
进一步阅读:
My cursor keys do not work 在 ncurses FAQ
Why can't I use the cursor keys in (whatever) shell? 在 xterm FAQ
Special Keys 在 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,在“键盘处理”部分,
The codes sent by the left arrow [...] can be given as
kcub1
.
根据termcap文件,序列应该是x1b O D
:
~ infocmp xterm | grep kcub1
kcub1=\EOD
虽然这在 xterm 和 termite 中都会发生,但在默认 tty 或 urxvt.
根据 xterm faq
escape sequences [...] were chosen as "PC-style" codes (like SCO "ansi"), i.e.,
ESC [ H ESC [ F
for normal mode, and
ESC O H ESC O F
for cursor application mode
我想我要么将 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
.
终端描述的特殊键列表假设应用程序已将终端初始化为全屏模式,使用应用程序模式特殊键而不是初始普通模式。命令行应用程序通常不会这样做(当然,它们可以:查找 smkx
和 rmkx
)。
进一步阅读:
My cursor keys do not work 在 ncurses FAQ
Why can't I use the cursor keys in (whatever) shell? 在 xterm FAQ
Special Keys 在 xterm 手册中。