![解析 terminfo u6 字符串](https://linux22.com/image/76124/%E8%A7%A3%E6%9E%90%20terminfo%20u6%20%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
看着术语信息和参数化字符串。
一些例子来自infocmp -1 xterm
:
cud=\E[%p1%dB
,给定参数13
:\E
=><ESC>
[
=>[
%p1
推参数1(13)到堆栈上%d
POP 并从堆栈打印为有符号十进制 =>13
- 结果:
<ESC>[13B
- 结果:
csr=\E[%i%p1%d;%p2%dr
,给定参数13, 16
:\E
=><ESC>
[
=>[
%i
递增参数 1 和 2:++13、++16 给出 14、17%p1
推参数1(14)到堆栈上。%d
以有符号十进制形式从堆栈中 POP 并打印。 =>14
;
=>;
%p2
推参数2(17)到堆栈上。%d
以有符号十进制形式从堆栈中 POP 并打印。 =>17
r
=>r
- 结果:
<ESC>14;17r
- 结果:
但是,...这个该怎么读?
u6=\E[%i%d;%dR
处理后,\E[%i
我们<ESC>[
增加了参数 1 和 2(如果有)。但堆栈是空的。这两个不应该%d
从堆栈中弹出并打印两个数字吗?
答案1
缺少一个%p
标记是 ncurses 的一个怪癖:terminfo 编译器(抽动症)识别任一 terminfo (使用%p1
到标记参数)或 termcap(依赖于习俗为参数)。这将是合法的术语帽表达。自从抽动症知道如何处理 termcap 表达式,显示的字符串“足够接近”,无需进一步翻译。
您可以使用以下命令查看 ncurses 的作用tput
,例如,
tput u6 40 50
给出(注意参数的反转)
^[[51;41R
如果表达式给出为
u6=\E[%i%p2%d;%p1%dR
它会产生相同的结果。
u6-u9 功能是早期的扩大记录在 ncurses 的终端数据库:
# INTERPRETATION OF USER CAPABILITIES
#
# The System V Release 4 and XPG4 terminfo format defines ten string
# capabilities for use by applications, <u0>...<u9>. In this file, we use
# certain of these capabilities to describe functions which are not covered
# by terminfo. The mapping is as follows:
#
# u9 terminal enquire string (equiv. to ANSI/ECMA-48 DA)
# u8 terminal answerback description
# u7 cursor position request (equiv. to VT100/ANSI/ECMA-48 DSR 6)
# u6 cursor position report (equiv. to ANSI/ECMA-48 CPR)
#
# The terminal enquire string <u9> should elicit an answerback response
# from the terminal. Common values for <u9> will be ^E (on older ASCII
# terminals) or \E[c (on newer VT100/ANSI/ECMA-48-compatible terminals).
#
# The cursor position request (<u7>) string should elicit a cursor position
# report. A typical value (for VT100 terminals) is \E[6n.
#
# The terminal answerback description (u8) must consist of an expected
# answerback string. The string may contain the following scanf(3)-like
# escapes:
#
# %c Accept any character
# %[...] Accept any number of characters in the given set
#
# The cursor position report (<u6>) string must contain two scanf(3)-style
# %d format elements. The first of these must correspond to the Y coordinate
# and the second to the %d. If the string contains the sequence %i, it is
# taken as an instruction to decrement each value after reading it (this is
# the inverse sense from the cup string). The typical CPR value is
# \E[%i%d;%dR (on VT100/ANSI/ECMA-48-compatible terminals).
#
# These capabilities are used by tack(1m), the terminfo action checker
# (distributed with ncurses 5.0).
检查最后一条评论,钉练习u8
and u9
but 对u6
and不执行任何操作u7
。
扩展已添加1995年初:
# 9.3.4 (Wed Feb 22 19:27:34 EST 1995):
# * Added correct acsc/smacs/rmacs strings for vt100 and xterm.
# * Added u6/u7/u8/u9 capabilities.
# * Added PCVT entry.
虽然它包含在多个条目中完整性(不多:18,699 行中出现了 16 次terminfo.src
),该功能没有知名用户。事实上,ncurses 中有一个地方可以可以已编写使用它(一些 ifdef'd 调试代码tty_update.c
文件),但使用硬编码转义序列(标记为“ANSI 兼容”)。
用户缺席的原因是:
- 反转任意 terminfo 表达式比看起来更难
- xterm 和类似的终端解释这些转义序列
在ECMA-48,这些是(u7)数字SR(设备状态报告)和(u6)心肺复苏(活跃位置报告)。
答案2
啊哈。
它是一个特别条目在数据库中。它给出了回复格式到u7
。
响应<ESC>[Y;XR
如 Y=行和 X=列。
如果 u6
有%i
,应该递减响应的值。
例子:
u6=\E[%i%d;%dR
u7=\E[6n
发送u7
。
- 响应例如:
\E[48;13R
。 - 结果:
Y = 48 - 1 = 47
X = 13 - 1 = 12
。