GT.Mプロセスは、プロセスのUNIX標準入力(READの場合)と標準出力(WRITEの場合)に$PRINCIPALを割り当てます。ローカル対話型プロセスの場合、$PRINCIPALは、ユーザーがサインオンしている「ターミナル」を識別します。
すべてのターミナルがCTRAPデバイスパラメータをサポートしていますが、$PRINCIPALだけがCENABLEをサポートしています。CTRAPは、ターミナル入力がプログラムフローをリダイレクトすることを可能にするが、CENABLEは、ターミナルユーザがダイレクトモードを呼び出すことを可能にします。
直接接続されたプリンタは、プリンタが高速パラレルインターフェースまたは非同期ターミナルコントローラを持つコンピュータに接続されているかどうかに関係なく、(一般的にプリンタは入力を提供していないにもかかわらず)ターミナルとしてしばしばGT.Mから見えます。
GT.Mは、一般的なオペレーティングシステム環境からターミナルの特性のその取り扱いを分離していません。GT.Mは、GT.M イメージが呼び出された時点で、有効なオペレーティングシステムのターミナル特性を継承します。GT.M が終了すると、オペレーティング・システムが認識しているターミナルの特性が復元されます。
しかし、もしプロセスが一時的にZSYSTEMコマンドでGT.M環境を離れた場合、GT.Mは外部環境によって残された端末のターミナルへの変更を認識しません。これは、ターミナルの物理的挙動とGT.M.によって検知される挙動との間に格差が生じる可能性があります。
UNIXは、サインイン ターミナル($PRINCIPAL)以外のターミナルの明示的OPENによって、標準デバイスのセキュリティを強制します。もしあなたがターミナルをOPENできない場合、システム管理者に連絡してください。
ターミナルの使用は、出力バッファをフラッシュするためのデバイスドライバを生じます。USEコマンドのこの機能では、時折必要とされる出力のタイミングの上でルーチン制御を提供します。しかし、それはまた、冗長なUSEコマンドが不要なパフォーマンスの低下を誘発する可能性があることを意味します。したがって、I/Oをリダイレクトしデバイスパラメータを変更し特に必要なフラッシュを開始する USEコマンドを制限することを、FISは推奨します。
ターミナル入力バッファーのサイズはUNIXでは1024に固定され、変数の読み取りは1023文字後に終了します。
環境変数 $TERMは、正確にターミナル(またはターミナルエミュレータ)の設定と一致する terminfo エントリを指定する必要があります。GT.Mを実行する必要があるプラットフォームの端末の設定の詳細については、terminfoのmanページを参照してください。
いくつかのterminfoエントリが正しく動作するように思えるかもしれませんが、GT.M.からエスケープシーケンス応答で、ファンクションキーシーケンスの認識 、または、カーソル位置にの認識に失敗します。GT.M自体は、特定の端末制御の特性について、すべての知識を持っていません。したがって、正しくは、GT.Mとターミナルとが通信できるように、正しいterminfoエントリを指定することが重要です。特定のプラットフォームや実装に応じて、新しい terminfoエントリを追加する必要があります。ターミナル(エミュレータ)ベンダも、ヘルプできる場合があります。
GT.Mは、次のterminfoの機能を使用します。完全な変数名は、丸括弧内のcapnameに続きます。
auto_right_margin(am), clr_eos(ed), clr_eol(el), columns(cols), cursor_address(cup), cursor_down(cud1),cursor_left(cub1), cursor_right(cuf1), cursor_up(cuu1), eat_newline_glitch(xenl), key_backspace(kbs), key_dc(kdch1),key_down(kcud1), key_left(kcub1), key_right(kcuf1), key_up(kcuu1), key_insert(kich1), keypad_local(rmkx),keypad_xmit(smkx), lines(lines).
編集が有効な場合、ダイレクトモードでの読み取りと、READs(読み取り以上*)として、GT.Mは、keypad_xmit 端末に送信します。GT.Mは、後にこれらのターミナルを読み取りを、keypad_localへ送信します。
ターミナルの論理レコードは、物理的スクリーン上の行に相当します。LENGTHデバイス特性がスクリーンの行数を指定する際には、WIDTHデバイス特性は、スクリーンの幅を指定します。
ターミナルにESCAPEシーケンスが有効で、入力に有効なエスケープシーケンスまたはターミネータ文字が含まれている場合、GT.Mはシーケンス全体を$ZBに格納し、最初の文字のASCII表現を返します。
例:
GTM>kill GTM>use $principal:escape GTM>read *x set zb=$zb zwrite (Press the F11 key on the VT220 terminal keyboard) x=27 zb=$C(27)_"[23~"
これは、READ * に応答して、エスケープシーケンスに入ります。READ * は、<ESC>のコードを変数Xに割り当てます。GT.Mはエスケープシーケンス全体を$ZBに置きます。文字の一部がグラフィックではないので、つまりターミナルで目に見えるので、例では、非図形文字が$CHAR()フォーマットで表示されるように、ローカル変数ZBに$ZBの内容を転送しZWRITEを使用しています。
エスケープ処理が無効になっている場合、<ESC>の場合 READ *x は、xに27を返します。もしエスケープイントロデューサもTERMINATORの場合、$ZBには長さが1の文字列でエスケープイントロデューサの $ASCII() 表現の値があり、そうでない場合は、$ZBは空の文字列を保持します。GT.Mはエスケープシーケンスの残りの文字を入力ストリームに格納します。READ *コマンドの後に続くREADコマンドは、エスケープシーケンスの残りの文字を返します。
例:
GTM>kill GTM>use $principal:(noescape:term=$char(13)) GTM>read *x set zb=$zb read y:0 zwrite (Press the F11 key on the terminal keyboard) [23~x=27 y="[23~" zb="" GTM>use $principal:noecho read *x set zb=$zb read y:0 use $principal:echo zwrite x=27 y="[23~" zb="" GTM>read *x set zb=$zb use $principal:flush read y:0 zwrite x=27 y="" zb=""
最初のREAD Y:0 が最初の文字の後にシーケンスをピックアップしている間、シーケンスのグラフィック部分がターミナル上に表示する方法に注意してください。 - すなわち、READ *X がシーケンスの残りの部分からエスケープ文字を分離したので、したがって、シーケンスとしてそれを認識しそのエコーを抑制することから、ターミナルドライバのロジックを防止しています。エコーの明示的な抑制は、この視覚的な乱れを消去します。READ Y:0の時点でそれが空になるように、最後のREAD *X の場合では、FLUSHは入力バッファをクリアします。
一般的に、GT.Mは、READ X#maxlenを$ZBでREADとして 同じようにメンテナンスを行います。しかし、もし入力が最大長に達してREAD X#maxlen が終了した場合、GT.Mは$ZBに null をセットします。端末がESCAPEシーケンシングを有効にし、入力にエスケープシーケンスが含まれている場合、GT.Mは$ZBにエスケープシーケンスを含めるように設定します。
次の表は、関連分野にグループ分けされたターミナル用のデバイスパラメータの簡単な要約です。詳細については、 “Open”, “Use”, “Close”を参照してください。
デバイスパラメータの相互作用(Interaction)管理 | ||
---|---|---|
デバイスパラメータ |
コマンド |
コメント |
[NO]CENABLE |
U |
ダイレクトモードへ移動するためにGT.Mが原因となりうる$PRINCIPALで<CTRL-C>かどうかを制御 |
CTRAP=expr |
U |
<CTRL>文字をトラップした上でのベクタ(vectoring)を制御 |
[NO]ESCAPE |
U |
エスケープシーケンスの処理を制御 |
[NO]PASTHRU |
U |
特殊制御文字(例えば<CTRL-B> )のオペレーティングシステムによって解釈を制御 |
[NO]TERMINATOR[=expr] |
U |
READの終了する文字を制御 |
デバイスパラメータのフロー制御 | ||
---|---|---|
デバイスパラメータ |
コマンド |
コメント |
[NO]CONVERT |
U |
大文字入力を強制することを制御 |
[NO]FILTER |
U |
いくつかの $X, $Y をメンテナンスすることを制御 |
FLUSH |
U |
タイプアヘッドバッファをクリア |
[NO]HOSTSYNC |
U |
XON/XOFFのホストの仕様を制御 |
[NO]READSYNC |
U |
XON/XOFFでREADの折り返し(wrapping)を制御 |
[NO]TTSYNC |
U |
XON/ XOFFへの入力応答を制御 |
[NO]TYPEAHEAD |
U |
要求されていない(unsolicited)入力処理を制御 |
デバイスパラメータの画面管理 | ||
---|---|---|
デバイスパラメータ |
コマンド |
コメント |
CLEARSCREEN |
U |
カーソルから画面の最終までをクリア |
DOWNSCROLL |
U |
画面の1ライン下げる |
[NO]ECHO |
U |
ホストの入力エコーを制御 |
ERASELINE |
U |
カーソルから行最終までをクリア |
[Z]LENGTH=intexpr |
U |
ページ($Y)の最大行数を制御 |
UPSCROLL |
U |
画面の1ライン上げる |
[Z]WIDTH=intexpr |
U |
出力ライン($X)の最大幅を制御 |
[Z][NO]WRAP |
U |
最大幅より長い出力行のハンドリングを制御 |
X=intexpr |
U |
整数式(intexpr)を列のカーソル位置にする |
Y=intexpr |
U |
整数式(intexpr)を行のカーソル位置にする |
O:OPENコマンドに適用
U:USEコマンドに適用
C:CLOSEコマンドに適用
このセクションでは、GT.Mのターミナル操作の例が含まれています。
例:
use $principal:(exception="zg "_$zl_":C^MENU")
この例では、プリンシパル(主)デバイスをUSEし、EXCEPTIONハンドラを設定します。エラーが発生すると、EXCEPTION が確立されたプロセス・スタック・レベルでルーチン ^MENU のラベルCに制御が移ります。
例:
use $principal:(x=0:y=0:clearscreen)
この例では、左上隅にカーソルを置き、画面全体をクリアします。
例:
use $principal:(noecho:width=132:wrap)
この例では、エコーを無効にし、自動折り返し(automatic WRAP)を有効にし、132文字にライン幅を設定します。
GT.Mは、WIDTHデバイスパラメータを指定すると自動的にWRAPを有効にします。
例:
use $principal:nocenable
この例は、<CTRL-C> を無効にします。