web-dev-qa-db-ja.com

コンソール出力の現在の色を決定する方法は?

色付きの端末が利用可能な場合、 エスケープ文字を使用して出力の色を付ける ができることは知っています。

しかし、出力が現在どの色で表示されているかを知る可能性はありますか?または、今すぐ出力するとしたら、テキストの色はどうなりますか?

これらのエスケープ文字を使用するときは、以前の色設定を壊さないようにお願いします。 「デフォルトの前景色」のエスケープ文字は、変更前のテキストの色ではなく、配色から情報を得ています。

14
Minix

一般に、現在の色を取得することは不可能です。端末の制御シーケンス処理は、端末の「内部」で発生します。端末emulatorなどのxtermや、カーネル仮想端末を提供するオペレーティングシステムカーネルに組み込まれている端末、現在の「グラフィックレンディション」(つまり、色)の概念を含むエミュレータの内部状態および属性)、マシン自体にあり、理論的にアクセス可能です。しかし、実際の端末の場合、この情報は、シリアルリンクを介して接続された物理的に別のマシン上のRAM=場所にあります。

つまり、some端末には、そのシリアルリンクを介して送信される端末プロトコルの一部としてそのような情報を読み取るためのメカニズムが含まれています。これらは、プログラムが端末に送信できる制御シーケンスを提供します。これにより、端末の入力として、内部状態に関する情報send backが発生します。 mikeservは、xterm端末エミュレータが応答する制御シーケンスを示しました。ただし、これらはxtermに固有です。たとえば、Linuxカーネルに組み込まれているターミナルエミュレータとさまざまなBSDカーネルは、異なるターミナルタイプであり、そのような制御シーケンスをまったく実装していません。同じことが、実際の端末のファミリ全体にも当てはまります。

DEC VT525端末は読み出しメカニズムを実装していますが、xtermで使用されるものとは関係のない一連の制御シーケンスがあります。 1つはDECRQSS(要求選択または設定)シーケンスを送信して現在のグラフィックレンディションを要求し、端末はDECRPSS(レポート選択または設定)を送信して応答します。具体的には:

  1. ホストが送信:DCS $qm ST(SGRの制御機能部分を設定とするDECRQSS)
  2. 端末が応答します:DCS 0$r0;33;44m ST(パラメーターと、現在の前景色と背景色を設定するSGR制御シーケンスの制御機能部分を含むDECRPSS)

もちろん、質問を注意深く読むと、チョコレートで覆われたバナナがヨーロッパの通貨システムで再び振られていることがわかります。あなたがしていること実際に解決策を選択し、その解決策の一部を実行する方法を尋ねたためにしようとしていることは、前の状態を保持する作成中いくつかの色付けされた出力。これを行うためのDEC VT制御シーケンスがあるだけでなく、xtermとさまざまなカーネル組み込み端末エミュレーターによって認識される、そのためのSCOコンソール端末シーケンス、およびtermcap/terminfoエントリーがあります。それらはあなたの端末にとって何であるかを教えてくれます。

Termcapエントリはscrcです。 terminfoエントリはsave_cursorおよびrestore_cursor。これらの名前は、効果があるとは少し誤解を招く可能性があります(ただし、de jureではなくde factoであるものに依存しているという警告として機能します)。実際のDECSC、DECRC、SCOSC、およびSCORC制御シーケンスは、現在のグラフィックレンディションも保存および復元します。

あなたが指摘した記事がすべてシェルスクリプトからの制御シーケンスの生成に関するものであるとすると、あなたが探しているコマンドnowtputです。

参考文献

11
JdeBP

xtermでは、クエリの色変更エスケープを変更することで、現在の色のRGBカラーコードを取得できます。 ESC ] Ps mを使用しますが、?疑問符を追加します。 docs から:

  • 名前またはRGB仕様ではなく"?"が指定されている場合、xtermは、対応する動的色を設定するために使用できる同じ形式の制御シーケンスで応答します。 1つの制御シーケンスで複数の色番号と仕様のペアを指定できるため、xtermは複数の応答を行うことができます。
    • P s = 1 0→VT100テキストの前景色をP tに変更します。
    • P s = 1 1→VT100テキストの背景色をP tに変更します。
    • P s = 1 2→テキストカーソルの色をP tに変更します。
    • P s = 1 3→マウスの前景色をP tに変更します。
    • P s = 1 4→マウスの背景色をP tに変更します。
    • P s = 1 5→Tektronixの前景色をP tに変更します。
    • P s = 1 6→Tektronixの背景色をP tに変更します。
    • P s = 1 7→ハイライトの背景色をP tに変更します。
    • P s = 1 8→Tektronixカーソルの色をP tに変更します。
    • P s = 1 9→ハイライトの前景色をP tに変更します。

これが別の端末エミュレータで機能する可能性があるかどうかは深刻な疑いがありますが、実行するとxtermで...

printf '\033]11;?\007'

...xtermは、次のようなシーケンスをターミナルの入力バッファにプッシュバックします...

11;rgb:ffff/ffff/ffff

...背景または前景:

printf '\033]10;?\007'

10;rgb:0000/0000/0000
10
mikeserv