コマンドラインアプリケーションの「GUI」がネットワークを介してどのように通信されるのか疑問に思いました。ほとんどの場合、それは非常に単純です(プレーンテキスト/入力)が、より複雑な場合もあります(適性)。
誰もが独自の端末を作成でき、すべての端末の実装が同じように動作するように、ある種の標準で定義されていますか(色、配置など)?
承認された回答:
コンソールプログラムは通常、cursesまたはその後継の1つ¹を使用して、話している種類のテキストユーザーインターフェイスを構築します。
これらのライブラリは、 termcap
と呼ばれる2つのデータベースのいずれかを使用します およびterminfo
.²これらのデータベースには、多数の多様な端末タイプで目的のアクションを取得するために送信するコードをライブラリに指示するマップが含まれています。これらのデータベースで定義されている端末タイプの大部分は、実際の端末の時代を生き延びていなかったため、現在は歴史的な関心事にすぎません。
ANSIターミナル
最新のUnixターミナルエミュレータ³は、ANSIX3.64プロトコルまたはそれ以降のバリアントの1つを使用します。
-
ANSI X3.64 :テレタイプとは対照的に、「ガラス端末」を制御するための標準。これは、リモート端末が解釈する文字の特別なシーケンスに基づいています。たとえば、UnixボックスがANSI X3.64互換端末にカーソルを画面の左上隅に移動するように指示する場合、Unixボックスは文字
ESC
を送信します。[コード>
1
;コード>
1
H
。最初の2文字は端末に制御シーケンスを予期するように指示し、1は行と列、およびH
「カーソル移動」を意味するコマンドです。⁴雑学:多くのPCBBSもANSIコードを使用していました。 (実際にはまだそうです。)
-
DEC VT100 :最初の非常に人気のあるANSI互換のガラス端子は、DigitalEquipmentCorporationのVT100でした。 ANSIのdejureを証明することによって 市場で標準的なものであり、事実上のを確立しました。 今日でも重要な基準。
これはVT102プロトコルと呼ばれることがあります。これは、後でコストが削減され、したがってより一般的なバージョンのVT100に加えて、使用可能なすべての拡張オプションが組み込まれています。
DEC端末プロトコルは下位互換性のあるシリーズであり、1978年に導入された最初のANSI互換モデル(VT100)から、1995年にDECから端末事業を買収した後にBoundlessTechnologiesによって製造されたVT500シリーズモデルまで拡張されています。現在は廃業していますが、その端末はまだ時々中古市場に出回っています。)
-
xterm :ANSIとVTの一種の融合-どんな規格でも。
xterm
のようなGUIターミナルエミュレータを使用しているときはいつでも またはその派生物の1つで、通常はxterm
も使用しています ターミナルプロトコル、通常はより最新のxterm-color
またはxterm-color256
バリアント。 -
Linux :Linuxコンソールも、
xterm
と同じ精神で、ANSIターミナルプロトコルの拡張バリアントを使用します。 プロトコル。その拡張機能のほとんどは、PCとガラス端末の違いに関係しています。たとえば、IBMキーボードには、DECVTにはないキーがいくつかあります。 (逆もまた同様です。)一部のUnixシステムには、独自のコンソール端末プロトコルもあります。
scoansi
があります たとえば、SCOUnix用のANSIX3.64バリアント。
典型的なターミナルエミュレータプログラムは雑種のようなものであり、単一のターミナルモデルを正確にエミュレートするわけではありません。 VT320までのすべてのDECVTエスケープシーケンスの96%をサポートする可能性がありますが、ANSIカラー(VT525機能)や任意の数の行と列などの拡張機能もサポートします。 curses
と言ったとしても、プログラムがこれらの機能を必要としない場合、理解できないコードの4%を見逃すことはありません。 (または何でも)それを使用するプログラムがVT320プロトコルを使用することを望みます。そのようなプログラムは、厳密に言えばそうではありませんが、それ自体をVT320互換としてアドバタイズする可能性があります。⁵
非ANSI端末
あなたがまだ時々出くわす他のいくつかの注目すべき基準があります:
-
ワイズ :ガラス端末の最も初期の独立した生産者の1つであるワイズは、ワークステーションコンピューティングがミニコンピューターに取って代わり始める前に、1980年代初頭に端末の製造を開始しました。 Wyse端末はVT100やその他の一般的な端末プロトコルをエミュレートできましたが、独自のネイティブコードもありました。
-
IBM 3270 :これは厳密には「Unix」端末タイプではありませんが、UnixシステムをIBMメインフレームに接続する必要があるため、IBM3270シリーズ端末エミュレータープログラムが作成されました。後のIBM5250シリーズ端末用のエミュレーターもかなり一般的であり、最近ではAS/400およびSystemiミニコンピューターへの接続に最も頻繁に使用されています。
-
Tektronix 4014 :PCやワークステーションがガラス端末を大幅に置き換えてビットマップグラフィックスを標準機能にする前は、上記のエスケープシーケンスと同様のテキストコマンドに応答して画面にグラフィックスを描画する高価なグラフィックス端末がありました。おそらく、これらの中で最も人気があったのはTektronix4010シリーズでした。
とても楽しかったです。グラフィックを描画するプログラムを作成することもできますが、それを実行してローカル端末に描画する代わりに、出力をファイルにリダイレクトすることができます。
$ ./my4014program > my-neat-graphic
次に、そのファイルを他の誰かに送信すると、その人は
cat
プログラムがなくてもグラフィックを表示するには、Tekターミナルでそれを実行します。魅力の一部は、これらの端末の描画がいかに遅いかでした。そのため、グラフィックが数秒かけて蓄積するのを見ることができました。
今日のUnixターミナルエミュレーションの操作
curses
のようなライブラリに求めている端末標準を見つけることができます TERM
を見て使用する 環境変数:
$ echo $TERM
xterm-color
ssh
を実行する場合 別のシステムへのTERM
変数が運ばれるので、リモートのUnixボックスはローカル端末との通信方法を知っています。
これらのプロトコルの多くはANSIX3.64バリアントであり、ユビキタスなASCIIおよびUTF-8文字コーディング標準が他の多くの処理を行っているため、誤った TERM
変数は通常、壊滅的ではありません。壊れやすいのは、HomeとPage Upのような拡張キー、Altキーの組み合わせ、色や太字などの活字表示機能です。
脚注:
-
最も一般的には、ncursesです。
curses
には完全な競争相手もいます S-LangなどのAPI。 -
AT&Tは
terminfo
を公布しました BSDのtermcap
の代わりとして データベース、そしてそれを置き換えることに大部分成功しました、しかしまだ古いtermcap
を使用するプログラムがそこにまだあります データベース。これは、最新のシステムでまだ見られるBSDとAT&Tの多くの違いの1つです。私のmacOSボックスには
/etc / termcap
がありません 、ただし、/ usr / share / terminfo
があります 、一方、FreeBSDの標準インストールは逆の方法ですが、これら2つのOSはコマンドラインレベルで非常に似ていることがよくあります。 -
minicom
、xterm
、mintty
、GNOMEターミナル、Terminal.appなど。 -
適切に記述されたUnixプログラムは、これらのエスケープシーケンスを直接出力しません。代わりに、上記のライブラリの1つを使用して、「カーソルを位置(1,1)に移動する」などと指示し、ライブラリ
TERM
に基づいて必要な端末制御コードを発行します 環境変数の設定。これにより、実行している端末の種類に関係なく、プログラムが正しく機能します。 -
古いテキスト端末には、プログラムであまり使用されない奇妙な機能がたくさんありました。そのため、人気のある端末エミュレータプログラムの多くは、これらの機能を実装していません。一般的な省略は、sixelグラフィックと倍幅/倍高のテキストモードのサポートです。
xterm
のメンテナvttest
というプログラムを作成しましたxterm
などのVTターミナルエミュレータをテストするため 。他のターミナルエミュレータに対して実行して、サポートされていない機能を見つけることができます。