terminfo およびParameterized Stringsを見てください。
infocmp -1 xterm
からのいくつかの例:
cud=\E[%p1%dB
、与えられた引数13
:
\E
=> <ESC>
[
=> [
%p1
パラメータ1(13)をスタックにプッシュします%d
POPしてスタックから符号付き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)をスタックにプッシュします。%d
POPしてスタックから符号付き10進数として出力します。 => 14
;
=> ;
%p2
パラメータ2(17)をスタックにプッシュします。%d
POPしてスタックから符号付き10進数として出力します。 => 17
r
=> r
<ESC>14;17r
しかし、...これを読む方法は?
u6=\E[%i%d;%dR
\E[%i
を処理した後、<ESC>[
があり、パラメーター1と2(存在する場合)がインクリメントされます。しかし、スタックは空です。 2つの%d
がスタックから2つの数値をポップして出力するべきではありませんか?
%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).
最後のコメントを確認すると、 tack はu8
とu9
を実行しますが、u6
と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.
completenessのいくつかのエントリに含まれていますが(多くはありません:terminfo.src
の18,699行に16回出現しています)、の有名なユーザーはありません。特徴。実際、ncursesには、それを使用するためにcouldが記述されている場所が1つあります( tty_update.c
のいくつかのifdefデバッグコード=ファイル)、ただし、ハードコードされたエスケープシーケンス(「ANSI互換」とマークされている)を使用します。
ユーザーが不在の理由は次のとおりです。
ECMA-48 では、これらは(u7)[〜#〜] dsr [〜#〜](デバイスステータスレポート)と(u6)[〜#〜] cpr [〜#〜](アクティブポジションレポート)。
あはは。
これは、データベース内の特別なエントリです。 respond format をu7
に与えます。
応答は、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
。