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


14

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

しかし、出力が現在表示されている色を見つける可能性はありますか?それとも、今すぐ出力する場合、テキストの色は何ですか?

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


termcapおよびterminfo変数を見ると、それは不可能だと思われます。たとえば、echotc Coまたはechoti colorsで端末がサポートする色の数を取得できますが、現在の色コード定義を保存する変数はありません。
jimmij

@jimmij私はそう思って、何かを逃したことを望んでいました。それが可能でないことについて十分に確信しているなら、それを答えにしてください。御時間ありがとうございます。
Minix 14

回答:


10

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

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

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

  1. ホスト送信:DCS $ q mST(設定としてSGRの制御機能部分を含むDECRQSS)
  2. ターミナルの応答:DCS 0 $ r 0 ; 3 3 ; 4 4 mST(現在の前景色と背景色を設定するSGR制御シーケンスのパラメーターと制御機能部分を備えたDECRPSS)

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

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

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

参考文献


素晴らしい答え。喜んで戻ってきました。どうもありがとう。
ミニックス

@Minix- scおよびrcに加えて、端末がサポートしている場合は、代替バッファを調べることもできます。そして、はい、これは素晴らしい答えです。Minix、おそらくこれも見てください:userspaceから/ dev / fb0をコンソールとして使用する方法noshスイートには、彼は彼自身があるお勧めします。
mikeserv

@mikeservリンクをお寄せいただきありがとうございます:)
Minix

2
これは「xtermが使用するものとは関係ない」ことに注意してください。ただし、xtermはかなり長い間DECRQSSをサポートしていました。色を含むSGR応答のある部分の日付は1996
トーマスディッキー

2
参照してください。また、読書を xtermがで色を提供し始めたときVT520の/ etcドキュメントが利用できなかったことを指摘するのxtermの制御シーケンスのドキュメントで、DECRQSS(...遅らせる約7年)。
トーマスディッキー

10

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

  • "?"名前またはRGB仕様ではなくa が指定されている場合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→テクトロニクスの背景色をP tに変更します。
    • P s = 1 7→ハイライト背景色をP tに変更します。
    • P s = 1 8→テクトロニクスのカーソルの色を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

そのため、を実行するとprintf '\033]10;rgb:8f8f/8f8f/8f8f8f\007、以前は「正常」だったターミナル内のすべてのテキストが水色に変わりました。その後、実行するprintf '\033]10;rgb:bfbfbf/bfbfbf/bfbfbf\007'と、すべての水色のテキストが「通常」に戻ります。この値を使用して、前進するテキストの色のみを変更するにはどうすればよいですか?
fourpast15

@fourpastmidnight:多分clear最初?
mikeserv

私はドキュメントを理解していないと思っています。「P s = 1 0-> VT100の前景色を変更する」とはっきり言っており、まあ、それはそれがしているように見えることです。;)しかし、それは私が期待したものではありません。「P s = 1 0; Pt =?」から取得したRGB値を使用する必要がある場合があります 私が望むものを達成するために別のエスケープされたコマンドで。
fourpast15

それでは、printf '\033]10;?\007'端末の現在の前景色をxtermに問い合わせます。ターミナルが「通常」(たとえば、前景色として7)で開始されたがtput setaf 3printfコマンドを実行する前に実行すると、printf上記のコマンドはまだ「通常」を返します。私が望んでいたのは、現在のカーソル位置の現在の色を取得して、後で「復元」するためにOPを保存することができるようにする方法でした。
fourpastmidnight

1
@fourpastmidnight-ここの回答のリンクをたどりましたか?また、トーマス・ディッキー- (彼はこの質問への他の回答にコメント)があるxtermのメンテナと、ここで積極的なメンバーです。(リンクは彼のウェブサイトにあります- xtermのエスケープドキュメントは広範です-そして基本的にはターミナルを書きたい他のプログラマーのための標準リファレンスです)
-mikeserv
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.