ターミナル入出力での $X
以下の表は、$X での異なる文字の影響を示します。
エコーされる文字 |
ASCII コード |
$X での効果 |
<FORM FEED> |
12 |
$X=0 |
<RETURN> |
13 |
$X=0 |
<LINE FEED> |
10 |
$X=$X |
<BACKSPACE> |
8 |
$X=$X-1 |
<TAB> |
9 |
$X=$X+1 |
出力できる ASCII 文字 |
32-126 |
$X=$X+1 |
出力できない文字 (エスケープ・シーケンスなど) |
127-255 |
"ObjectScript の使用法" を参照してください。 |
OPEN コマンドと USE コマンドの S(ecret) プロトコルは、エコーをオフにします。また、入力中に $X が変更されるのを防ぎ、正しいカーソル位置を示します。
WRITE $CHAR() は $X を変更します。WRITE * は、$X を変更しません。例えば、WRITE $X,"/",$CHAR(8),$X は、バックスペースを実行 (/ 文字を削除) し、それに応じて $X をリセットして、01 を返します。一方、WRITE $X,"/",*8,$X は、バックスペースを実行 (/ 文字を削除) しますが、$X をリセットしないで 02 を返します (詳細は WRITE コマンドを参照)。
WRITE * を使用すると、ターミナルに制御シーケンスを送信しても、$X は真のカーソル位置を示します。制御シーケンスによってはカーソルを移動するものもあるので、SET コマンドを使用して直接 $X を設定することができます。例えば、以下のコマンドは Digital VT100 端末 (あるいは同等の端末) でコラム 20 と行 10 にカーソルを移動し、それにしたがって $X と $Y を設定します。
SET dy=10,dx=20
WRITE *27,*91,dy+1,*59,dx+1,*72
SET $Y=dy,$X=dx
デバイスは動作するのに出力しない ANSI 標準制御シーケンス (エスケープ・シーケンスなど) は、$X 値、$Y 値と正しいカーソル位置の間での矛盾を生じます。この問題を避けるために WRITE * (整数式) 構文を使用して、文字列で各文字の ASCII 値を指定します。例えば、以下の形式ではなく
WRITE !,$CHAR(27)_"[1m"
WRITE !,$X
同じ意味を持つ以下の形式を使用します。
WRITE !,*27,*91,*49,*109
WRITE !,$X
通常、明示的にカーソルを移動するエスケープ・シーケンスの後、$X と $Y を更新して、実カーソル位置を反映します。
%SYSTEM.ProcessOpens in a new tab クラスの DX()Opens in a new tab メソッドを使用すると、$X による現在のプロセスのエスケープ・シーケンスの処理方法を設定できます。システム全体の既定の動作は、Config.MiscellaneousOpens in a new tab クラスの DXOpens in a new tab プロパティで設定できます。