特定のプログラムで背景とフォントの色を設定し、画面上の同じ場所(3行目、5列目など)に文字を複数回書き込むにはどうすればよいですか?
いくつかの例は、curl google.com > a
によって表示される進行状況バー、いくつかのインストール画面、およびほぼすべてのテキストエディターです。
あなたが尋ねているのは、実際にはグラフィックスAPIではなく、単なる端末制御文字です。
その背後には多くの歴史がありますが、当時の端末はテレタイプマシンでした。基本的に、シリアル接続でコンピュータに接続されたトラックフィード紙を備えたタイプライター。文字を入力すると、そのバイナリ値がコンピューターに送信されます(ページに入力するだけでなく)。コンピュータは、要求したものの出力として文字を印刷します。
端末の制御には特殊文字が使用されていました(制御キーの出所であり、それらの文字を生成するためのものでした)。たとえば、_^H
_または_^?
_はバックスペース、_^M
_はキャリッジリターン(カーソルを行の先頭に移動)、_^J
_は改行(ページを1行上に移動します)。一部の制御コードには、制御文字を生成するためのCのエスケープシーケンス(ほとんどすべてのプログラミング言語で共有)があります。前述のコントロールは、それぞれ_\b
_、_\r
_、_\n
_です。
現在使用しているターミナルエミュレータは、その名のとおり、古いテレタイプマシンのふりをしているソフトウェアです。ある意味では、Unixは、タイプライターを使用して通信しているとまだ考えているようです。
curl
の場合、行全体を書き込んでから_\r
_(キャリッジリターン)を送信し、カーソルを行の先頭に移動してから別の行を書き込みます。改行が送信されないため、画面上の同じ行に書き込みを続けます。
これを実証するために試すことができるものを以下に示します。
_echo -n "First" ; sleep 5 ; echo -en "\rSecond\n"
_
「First」という単語が印刷されます(ただし、新しい行は送信されません)。 5秒後、「Second」という単語に置き換えられ、新しい行が送信されます。このパターンを無期限に繰り返すことができます。自分で「サード」を追加してみてください。おそらく予期していなかったものが表示されます;-)
これらおよびその他の制御文字の詳細については、ascii(7)
マニュアルを参照してください。
ncurses のようなものをお探しですか?
その質問は実際にはいくつかの質問であり、「制御文字」はその一部のみに対応しています。たとえば、curl
のプログレスバーです。より一般的には、これらは端末(および端末エミュレータ)の一般的な機能です。
これらの一般的な機能のほとんどは、 ECMA-48:コード化された文字セットの制御関数 で標準化されています。ただし、他の機能はnotです。それらは実装によって定義されます。
ECMA-48は制御機能を参照します。これには、制御文字および制御シーケンス(エスケープシーケンス、ANSIシーケンスなどと呼ばれることが多い)が含まれます。
一部の制御文字は、単純な操作に使用されます(例:
curl
のプログレスバーは、これらの簡単な操作を使用して作成されます。しかし、制御文字ができることはそれだけです。制御シーケンスはさらに多くのことを行います。
単純なものと複雑なものの類似点については、これで十分です。制御シーケンスは、テキストと背景の色の変更、画面からのテキストの消去、テキストの反転表示(または太字、下線、点滅)にも使用されます。
逆ビデオ(または色付き)の進行状況バーを描画するプログラムは、制御シーケンスを使用します。
制御シーケンスはさらに多くのことを実行できますが、特定のことしか実行できません。それらを組み合わせてテキストエディターを作成すると、インストール画面(および色付きの進行状況バーを描画するプログラム)は複雑になります。これらのことを知っているライブラリを使用することで、その一部が簡単になります。最初は、termcap(および数百種類の端末のデータベース)をterminfo(および約1000種類の端末のデータベース)に拡張しました。
標準化しても、useできる端末の説明は数十あります。そのため、これらのアプリケーションの最も重要なものを除くすべてのライブラリを使用し続けます。 1つはncurses( "new-curses")で、もう1つはスラング(技術的には "S-Lang")です。
参考文献: