特定のプログラムで背景色やフォント色を設定したり、画面上の同じ場所 (例: 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") です。
参考文献: