ターミナル機能のデータベース
文字ウィンドウのサブシステムの重要な特徴は、ターミナルに完全に依存しない点です。ただし、現在のターミナルの詳細について最低限のレベルで認識しておく必要があります。例えば、ターミナルの行数や列数、画面上でのカーソルの配置方法、およびカーソルが最後の列に達したときの次の行への自動折り返しなどについて把握しておく必要があります。
ターミナルに関する情報の集合を、"ターミナル機能" と呼びます。これは ^%SYS("tercap") グローバルに保存され、/INIT コマンドを発行するとメモリにロードされます。ターミナル機能のデータベースには、以下の項目が含まれています。
-
ターミナルの名前とエイリアス ("vt220|VT220|DEC-vt220" など)
-
ブーリアン・フラグのセット (色、自動折り返しなど)
-
数値定数のセット (行 x 列など)
-
制御シーケンスのセット (/cup、/el など)
-
境界線マップ (どの制御シーケンスが境界線を描画するかを知らせる)
既存のターミナルの説明を編集でき、新しいターミナルの説明を TERCAP ユーティリティで作成できます。
TERCAP ユーティリティ
TERCAP はターミナルの説明を作成および編集するためのユーティリティです。ユーティリティのプロンプトは、ほとんどの場合、? を入力することでオプションのリストを表示できます。%SYS ネームスペースからこのユーティリティを実行するには、以下のように入力します。
%SYS>D ^TERCAP
Option: プロンプトで「?」(疑問符) を入力すると、以下の 3 つのオプションが表示されます。
Option: ?
1 - Edit/create terminal description
2 - Edit/create border map
3 - Delete terminal description
-
オプション 1 の詳細は、"ターミナルの説明の作成および編集" を参照してください。このオプションを使用すれば、ターミナルの名前やエイリアスを定義したり、ブーリアン・フラグ、数値定数、および制御シーケンスを設定したりできます。
-
オプション 2 の詳細は、"境界線マップの作成および編集" を参照してください。
-
オプション 3 を使用すると、不要なターミナルの説明を削除できます。
制御シーケンス
ターミナルに送られた制御シーケンスは、画面のクリアや、特定の座標へのカーソルの配置といった、ターミナルのアクションをトリガします。リテラル (定数コード) のみを使用する /clr のようなシーケンスもあれば、パラメータを含む /cup(l,c) のようなシーケンスもあります。これらのテーブルの作成と維持を容易にするために、ObjectScript に似た特別な構文が考案されました。制御シーケンスは、リテラル、式、または関数が一般的です。リテラルは、単純に二重引用符内の ASCII 文字 ("[H" など) です。
必要に応じて、引用符記号はリテラルとして含まれる場合に重複できます。式は、オプションで 10 進定数に追加されるパラメータ (%1、%2 など) です。ニーモニックが異なると、パラメータの意味が異なります。例えば、/cup(l,c) の場合、%1 は l (行番号) を表し、%2 は c (列番号) を表します。/ind(n) の場合、%1 は "インデックス" 処理のリピート・カウントを表します。例えば、式は以下のようになります。
%1 %1+32 %2-1
パラメータに追加されるオフセットの範囲は、[-128,127] に制限されます。
関数は、$C (<コード・リスト>) または $A (<式>) のいずれかです。$C の機能は、同じ名前の ObjectScript 関数と同じです。以下のように、ターミナルに送られる制御文字を示す場合に使用されます。
$c(27)
$c(155,31)
ただし、$A の機能は、ObjectScript の関数と同じではありません。囲み <式> は、評価されてから、ASCII 文字としてターミナルに送られる必要があり、バイナリ形式は使用できません。
$c(65) は "A" (コード 65) を送信します。
$a(65) は文字列 "65" (コード 54、53) を送信します。
$a(%1) 一連の ASCII 文字として %1 を送信します。
$a(%2+32) は %2+32 を評価して、一連の ASCII 文字として送信します。
完全な例については、ANSI ターミナルの /cup(l,c) シーケンスを検討します。
$c(27),"[",$a(%1+1),";",$a(%2+1),"H"
どちらのパラメータにも送信前に追加された 1 があります。これはその内部フォームが 1 ではなく 0 で始まるためです。