色付きの端末が利用可能な場合、エスケープ文字を使用して出力に色を付けることができることを知っています。
しかし、出力が現在表示されている色を見つける可能性はありますか?それとも、今すぐ出力する場合、テキストの色は何ですか?
これらのエスケープ文字を使用するとき、以前の色設定を壊さないようにお願いしています。「デフォルトの前景色」エスケープ文字は、変更前のテキストの色ではなく、カラースキームから情報を取得しています。
色付きの端末が利用可能な場合、エスケープ文字を使用して出力に色を付けることができることを知っています。
しかし、出力が現在表示されている色を見つける可能性はありますか?それとも、今すぐ出力する場合、テキストの色は何ですか?
これらのエスケープ文字を使用するとき、以前の色設定を壊さないようにお願いしています。「デフォルトの前景色」エスケープ文字は、変更前のテキストの色ではなく、カラースキームから情報を取得しています。
回答:
一般に、現在の色を取得することは不可能です。端末の制御シーケンス処理は、それがどこにあっても、端末の「内部」で行われます。ターミナル付きxterm
カーネル仮想端末を提供するオペレーティングシステムカーネルなどのエミュレーターでは、現在の「グラフィックレンディション」(色や属性)の概念を含むエミュレーターの内部状態がマシン上にあります。それ自体と理論的にアクセス可能です。しかし、実際の端末の場合、この情報は、シリアルリンクを介して接続された物理的に独立したマシン上のRAMの場所にあります。
ただし、一部の端末には、そのシリアルリンクを介して送信される端末プロトコルの一部としてこのような情報を読み取るためのメカニズムが含まれています。これらは、プログラムが端末に送信できる制御シーケンスを提供し、プログラムは端末入力として内部状態に関する情報を送り返します。 端末エミュレーターが応答するmikeserv
制御シーケンスを示しxterm
ました。しかし、これらはに固有xterm
です。たとえば、LinuxカーネルのビルトインターミナルエミュレーターとさまざまなBSDカーネルは異なるターミナルタイプであり、そのような制御シーケンスをまったく実装していません。同じことが、実際の端末のファミリ全体にも当てはまります。
DEC VT525端末は読み出しメカニズムを実装しますが、で使用されるものとは関係のない一連の制御シーケンスを持っていxterm
ます。DECRQSS(要求の選択または設定)シーケンスを送信して現在のグラフィックレンディションを要求し、端末はDECRPSS(レポートの選択または設定)を送信して応答します。具体的には:
$
q
m
ST(設定としてSGRの制御機能部分を含むDECRQSS)0
$
r
0
;
3
3
;
4
4
m
ST(現在の前景色と背景色を設定するSGR制御シーケンスのパラメーターと制御機能部分を備えたDECRPSS)もちろん、あなたの質問を注意深く読むと、それらのヨーロッパ通貨システムでチョコレートで覆われたバナナを再び振っていることがわかります。ソリューションを選択し、そのソリューションの一部を実行する方法を尋ねた実際にあなたがしようとしているのは、カラー化された出力を書き込む間、以前の状態を保持することです。これを行うためのDEC VT制御シーケンスがあるだけでなく、そのためのSCOコンソールターミナルシーケンスxterm
と、さまざまなカーネル組み込みターミナルエミュレーター、およびそれらがターミナル用であるかを示すtermcap / terminfoエントリがあります。
termcapエントリがあるsc
とrc
。terminfoのエントリがあるsave_cursor
とrestore_cursor
。名前は、効果に関して多少誤解を招く可能性があります(ただし、これらは、事実ではなく事実に依存しているという警告として機能しますが) de jure)。実際のDECSC、DECRC、SCOSC、およびSCORC制御シーケンスは、現在のグラフィックレンディションも保存および復元します。
あなたが指摘した記事がシェルスクリプトから制御シーケンスを生成することに関するすべてであることを考えると、あなたが今探しているコマンドはtput
です。
sc
およびrc
に加えて、端末がサポートしている場合は、代替バッファを調べることもできます。そして、はい、これは素晴らしい答えです。Minix、おそらくこれも見てください:userspaceから/ dev / fb0をコンソールとして使用する方法。nosh
スイートには、彼は彼自身があるお勧めします。
では、xterm
色変更エスケープをクエリに変更することにより、現在の色のRGBカラーコードを取得できます。ESC ] Ps m
-を使用しますが、?
疑問符を追加します。ドキュメントから:
"?"
名前またはRGB仕様ではなくa が指定されている場合xterm
、対応する動的な色を設定するために使用できる同じ形式の制御シーケンスで応答します。1つの制御シーケンスで複数の色番号と仕様のペアを指定できるため、xterm
複数できるため、複数の応答を行うことができます。
これが別のターミナルエミュレータで動作する可能性が高いかどうかは深刻な疑いがありますが、xterm
実行すると...
printf '\033]11;?\007'
... xterm
次のようなシーケンスを端末の入力バッファにプッシュバックします...
11;rgb:ffff/ffff/ffff
...背景または前景の場合:
printf '\033]10;?\007'
10;rgb:0000/0000/0000
printf '\033]10;rgb:8f8f/8f8f/8f8f8f\007
、以前は「正常」だったターミナル内のすべてのテキストが水色に変わりました。その後、実行するprintf '\033]10;rgb:bfbfbf/bfbfbf/bfbfbf\007'
と、すべての水色のテキストが「通常」に戻ります。この値を使用して、前進するテキストの色のみを変更するにはどうすればよいですか?
clear
最初?
printf '\033]10;?\007'
端末の現在の前景色をxtermに問い合わせます。ターミナルが「通常」(たとえば、前景色として7)で開始されたがtput setaf 3
、printf
コマンドを実行する前に実行すると、printf
上記のコマンドはまだ「通常」を返します。私が望んでいたのは、現在のカーソル位置の現在の色を取得して、後で「復元」するためにOPを保存することができるようにする方法でした。
xterm
のメンテナと、ここで積極的なメンバーです。(リンクは彼のウェブサイトにあります- xterm
のエスケープドキュメントは広範です-そして基本的にはターミナルを書きたい他のプログラマーのための標準リファレンスです)
echotc Co
またはechoti colors
で端末がサポートする色の数を取得できますが、現在の色コード定義を保存する変数はありません。