端末のグラフィック API とは何ですか?

端末のグラフィック API とは何ですか?

特定のプログラムで背景色やフォント色を設定したり、画面上の同じ場所 (例: 3 行目、5 列目) に文字を複数回書き込んだりするにはどうすればよいでしょうか。

例としては、 によって表示される進行状況バーcurl google.com > a、一部のインストール画面、およびほぼすべてのテキスト エディターが挙げられます。

答え1

あなたが尋ねているのは、実際にはグラフィック API ではなく、端末制御文字だけです。

そこには多くの歴史がありますが、当時の端末はテレタイプマシン。基本的には、シリアル接続でコンピューターに接続されたトラック給紙式タイプライターです。文字を入力すると、そのバイナリ値がコンピューターに送信されます (ページ上にも入力されます)。コンピューターは、要求された出力として文字を印刷します。

特殊文字は端末の制御に使用されました (制御キーの由来はここにあり、これらの文字を生成するためのものでした)。たとえば、^Hまたは は^?バックスペース、^Mはキャリッジ リターン (カーソルを行頭に移動)、^Jはライン フィード (ページを 1 行上に移動) です。一部の制御コードには、制御文字を生成するための C のエスケープ シーケンスがあります (これはほぼすべてのプログラミング言語で共有されています)。前述の制御はそれぞれ\b、、、になります。\r\n

端末エミュレータ今日使用しているソフトウェアは、まさにその名の通り、古いテレタイプ機を装ったソフトウェアです。ある意味、Unix は通信にタイプライターを使用していると今でも考えているようなものです。

の場合curl、1 行全体を書き込み、次に\r(復帰) を送信してカーソルを行の先頭に移動し、次の行を書き込みます。改行が送信されないため、画面上で同じ行に書き込みが続けられます。

これを実証するために試すことができるものは次のとおりです。

echo -n  "First" ; sleep 5 ; echo -en "\rSecond\n"

「First」という単語が印刷されます (ただし、新しい行は送信されません)。5 秒後に「Second」という単語に置き換えられ、新しい行が送信されます。このパターンは無制限に繰り返すことができます。自分で「Third」を追加してみてください。おそらく予想していなかったものが表示されるでしょう ;-)

これらおよびその他の制御文字の詳細については、ascii(7)マニュアルを参照してください。

答え2

次のようなものをお探しですか?ncurses?

答え3

その質問は実際にはいくつかの質問であり、「制御文字」は、たとえば の進行状況バーなど、そのごく一部にしか対応していませんcurl。より一般的には、これらは端末 (および端末エミュレータ) の一般的な機能です。

これらの共通機能のほとんどは標準化されており、ECMA-48: コード化文字セットの制御関数しかし、他の機能はないこれらは実装定義です。

ECMA-48は制御機能これには以下が含まれます制御文字そして制御シーケンス(エスケープ シーケンス、ANSI シーケンスなどとも呼ばれます)。

いくつかの制御文字は、単純操作、例:

  • カーソルを同じ行の前の列に移動する
  • カーソルを同じ行の最初の列に移動する
  • カーソルを同じ行の次のタブストップに移動する
  • カーソルを次の行に移動する(そして画面をスクロールする)もしすでに最後の列にあります)

のプログレスバーは、curlこれらの単純な操作を使用して構築されています。ただし、制御文字でできることは限られています。制御シーケンスは、たとえば、より多くのことを行うことができます。

  • カーソルを画面上の任意の行/列に移動する
  • 画面上の同じ列の任意の行にカーソルを移動する
  • 画面上の同じ行の任意の列にカーソルを移動する
  • 画面上の任意の列にタブストップを設定する
  • カーソルを前の行に移動する
  • カーソルを動かさずに画面を上下にスクロールする

単純と複雑の類似点はここまでです。制御シーケンスは、テキストと背景の色を変更したり、画面からテキストを消去したり、テキストを反転表示したり (または太字、下線、点滅) するためにも使用されます。

反転表示(または色付き)のプログレスバーを描画するプログラムは、制御シーケンス

制御シーケンスはより多くの機能を持つことができますが、実行できるのは特定のことだけです。これらを組み合わせてテキスト エディター、インストール画面 (および色付きの進行状況バーを描画するプログラム) を作成するのは複雑になります。これらの機能を認識するライブラリを使用すると、その一部は簡単になります。最初は、termcap (および数百種類の端末のデータベース) があり、それが terminfo (および約 1,000 種類の端末のデータベース) に拡張されました。

標準化されていても、端末の記述は数十種類あり、使用そのため、私たちは、これらのアプリケーションのうち、ごく些細なものを除いてすべてにライブラリを使い続けています。1 つは ncurses ("new-curses")、もう 1 つは slang (技術的には "S-Lang") です。

参考文献:

関連情報