web-dev-qa-db-ja.com

terminfou6文字列を解析します

terminfo およびParameterized Stringsを見てください。

infocmp -1 xtermからのいくつかの例:

  • cud=\E[%p1%dB、与えられた引数13

    • \E => <ESC>
    • [ => [
    • %p1パラメータ1(13)をスタックにプッシュします
    • %dPOPしてスタックから符号付き10進数として出力=> 13
      • 結果:<ESC>[13B
  • csr=\E[%i%p1%d;%p2%dr、引数を指定13, 16

    • \E => <ESC>
    • [ => [
    • %iパラメータ1と2をインクリメントします:++ 13、++ 16は14、17を与えます
    • %p1パラメータ1(14)をスタックにプッシュします。
    • %dPOPしてスタックから符号付き10進数として出力します。 => 14
    • ; => ;
    • %p2パラメータ2(17)をスタックにプッシュします。
    • %dPOPしてスタックから符号付き10進数として出力します。 => 17
    • r => r
      • 結果:<ESC>14;17r

しかし、...これを読む方法は?

  • u6=\E[%i%d;%dR

\E[%iを処理した後、<ESC>[があり、パラメーター1と2(存在する場合)がインクリメントされます。しかし、スタックは空です。 2つの%dがスタックから2つの数値をポップして出力するべきではありませんか?

6
user3342816

%pマーカーがないことは、ncursesの癖です:terminfoコンパイラー( tic )は、terminfo(%p1からmarkparameters)またはtermcap(パラメーターはconventionに依存します)。これは、正当なtermcap式になります。 ticはtermcap式の処理方法を知っているため、表示される文字列は「十分に近い」ため、さらに変換する必要はありません。

tput を使用してncursesが何をするかを確認できます。例:

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).

最後のコメントを確認すると、 tacku8u9を実行しますが、u6u7には何もしません。

拡張機能が追加されました 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.

completenessのいくつかのエントリに含まれていますが(多くはありません:terminfo.srcの18,699行に16回出現しています)、の有名なユーザーはありません。特徴。実際、ncursesには、それを使用するためにcouldが記述されている場所が1つあります( tty_update.c のいくつかのifdefデバッグコード=ファイル)、ただし、ハードコードされたエスケープシーケンス(「ANSI互換」とマークされている)を使用します。

ユーザーが不在の理由は次のとおりです。

  • 任意のterminfo式を反転することは、見た目よりも難しいです
  • xtermおよび同様の端末は、これらのエスケープシーケンスを解釈します

ECMA-48 では、これらは(u7)[〜#〜] dsr [〜#〜](デバイスステータスレポート)と(u6)[〜#〜] cpr [〜#〜](アクティブポジションレポート)。

5
Thomas Dickey

あはは。

これは、データベース内の特別なエントリです。 respond formatu7に与えます。

応答は、Y =行およびX =列のように<ESC>[Y;XRです。

u6%iがある場合、応答値をデクリメントする必要があります。

例:

  • u6=\E[%i%d;%dR
  • u7=\E[6n

u7を送信します。

  • 例:\E[48;13R
  • 結果:
    • Y = 48 - 1 = 47
    • X = 13 - 1 = 12
2
user3342816