我在写一个CLI服务器。在我的项目中,我做了以下(简化)工作:
curses.setupterm("rxvt")
smkx = curses.tigetstr("smkx")
write_to_terminal_client(smkx)检测到的smkx序列仅为"\E=“,它与"infocmp rxvt”(一个糟糕的终结项?)匹配。
现在,当我运行我的CLI服务器并在rxvt终端上使用telnet连接到它时,终端将接收smkx序列。当rxvt终端上的用户按左箭头键时,我希望"\E[D“序列被发送到CLI服务器(因为应用程序模式已经设置)。不幸的是,当smkx序列已经发送或尚未发送到终端客户端时,序列总是"\EOD“。
我尝试将smkx序列硬编码为"\E[?1h\E=“,并将其发送到客户端,但没有改变任何内容。
此外,终端不响应DECRQM查询。
我的全部图片是,我的应用程序学习终端的名称,并查询终端数据库的关键代码和其他功能。我运行的是ubuntu 13.10。Rxvt终端为"2.7.10“
问题如下:
问候
发布于 2015-05-19 08:36:20
问题似乎是,您的程序正在发送smkx (很好),但假设它知道将为各种特殊键发送的字符串(不好)。在正确构造的终端描述中,还列出了特殊密钥(请参见终止(5)):
key_up kcuu1 ku向上箭头键key_down kcud1 kd向下箭头键key_left kcub1 kl左箭头键key_right kcuf1 kr右箭头键
因此,与其寻找\E[D,您的程序应该查找tigetstr所说的用于kcub1的字符串。
对于DECRQM,rxvt可能不会实现这一点,因为它不是"VT100“控制序列。指的是http://invisible-island.net/xterm/ctlseqs/ctlseqs.html,即"For VT300 and up",而rxvt手册页面则表示"vt102终端“。
虽然报告中偶尔会出现问题,但终端数据库在很大程度上反映了用户约定与实际终端功能之间的权衡。有些用户(特别是具有bash的Linux用户)不喜欢使用终端的应用程序模式。在这个利基之外,长期的惯例一直是使用应用模式。术语手册提供了关于这个主题的更多讨论。
在ncurse中,infocmp命令有一个特性(选项-i),它让您更清楚地看到(更多)初始化字符串的效果。它不分解rmkx/smkx,但很容易添加。这样做,它将向rxvt报告:
is1: {DEC-47}{DECPAM}{DEC-CKM}
is2: {RSR}{SGR0}\E[2J{home}{DEC+AWM}{DEC-CKM;COLM;SCLM;OM}{rmir}
rs1: {rmkx}{ECMA-1;3;IRM;5;6}{DEC+AWM}{SGR0}{RSR}\E[2J{home}
rs2: {is2}{rmkx}{DEC-1000}{cnorm}
smcup: {sc}{DEC+47}
rmcup: \E[2J{DEC-47}{rc}
smkx: {DECPAM}
rmkx: {DECPNM}第十条:
is2: \E[!p{DEC-COLM;SCLM}{rmir}{DECPNM}
rs1: {RIS}
rs2: {is2}
smcup: {DEC+1049}
rmcup: {DEC-1049}
smkx: {DEC+CKM}{DECPAM}
rmkx: {DEC-CKM}{DECPNM}也就是说,对xterm的终端描述使smkx/rmkx打开/关闭DECCKM (游标键),而rxvt则没有。此外,rxvt的初始化字符串会关闭DECCKM。
https://stackoverflow.com/questions/30163286
复制相似问题