解析 terminfo u6 字符串

解析 terminfo u6 字符串

看着术语信息参数化字符串

一些例子来自infocmp -1 xterm

  • cud=\E[%p1%dB,给定参数13

    • \E=><ESC>
    • [=>[
    • %p1推参数1(13)到堆栈上
    • %dPOP 并从堆栈打印为有符号十进制 =>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).

检查最后一条评论,练习u8and u9but 对u6and不执行任何操作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

相关内容