it-swarm-ja.com

ANSIカラーのRGB値を取得するためのXterm制御シーケンス

(一部の)端末では、次のようなシーケンスを使用できます。

printf "\e]4;3;rgb:cc/78/33\e\\"

aNSIカラーパレットの3番目の色を#CC7833で表されるRGB値に設定します。あなたは反対をすることができますか? 3番目の(まあ、実際には)色の現在のRGB値(任意の形式)を取得できますか?

どうして?

私の場合、これを実行したい理由は、カラーテーブル全体を(意図的に)混乱させる前に保存できるようにするためです。 RGBの正確なカラーテーマを使用してターミナルにコードをリストできるようにしたいのですが、私をアナルと呼んでください。これを行うには、上記のように、ターミナルカラーテーブルのカラー定義をオーバーライドする必要があります。

私にとって、問題は解決されました。しかし、この機能を多くの人が使用する既存のオープンソースプロジェクト(pry)に追加したいので、プログラムセッションのテーマの色を設定する前に、カラーパレットの現在の状態を保存して、それらを切り替えることができる必要があります。後で戻って。

一部の端末では設定にこれがあり、一部のシステムでは構成ファイルにこれがあることを知っています。しかし、私は一般的で、システム間で機能するものが必要です。理想的には、上記の方法でそれらを設定することをサポートするすべてのシステム:)

ボーナス

現在、色の変更は、ターミナルを閉じて再起動した後でも、システム全体、すべてのターミナルセッションに影響します(これはOS X Mountain LionでiTerm2を使用しています)。

効果をローカルにすることができれば、たとえばサブシェルに対して、プロセスが終了したときに変更がサブシェルで消滅するため、問題は解消されます。セッションがクラッシュした場合から保護するので、さらに良いです...

あなたはで色を照会することができます

printf "\e]4;3;?\e\\"

これにより、端末に入力したかのように応答がキーボードバッファに配置されます(シェルスクリプトで処理するのは困難です)。またはあなたは使用することができます

xtermcontrol --get-color3

これは、このエスケープシーケンスを使用する便利なフロントエンドです。

3
egmont

私が考えることができるこれの標準的な方法に最も近いのは、xrdbに依存することです。 xrdb -queryを使用して、現在のXセッションで使用されている色の値を取得できます。たとえば、私のものは次のものを提供します。

 *背景:#151515 
 * color0:#101010 
 * color1:#E84F4F 
 * color10:#A0CF5D 
 * color11:#F39D21 
 * color12:#4E9FB1 
 * color13:#8542FF 
 * color14:#42717B 
 * color15:#dddddd 
 * color2:#B8D68C 
 * color3:#E1AA5D 
 * color4:#7DC1CF 
 * color5:#9B64FB 
 * color6:#6D878D 
 * color7:#dddddd 
 * color8:#404040 
 * color9:#D23D3D 
 *前景:#D7D0C7 
 ... 

残念ながら、xrdbの動作方法により、xrdbの全体的なポイントは、現在のxセッションの設定を調整することであるため、サブシェルの設定のみを設定する方法を認識していません。ただし、xrdb -queryを介して設定をエクスポートし、完了したらそれらを再ロードすることで、その周りを「ハック」することができます。

2
tgood

私が使用した古典的な方法は、新しいクラスのxrdbプロパティのセットを定義することでした---そのように:( Linuxでは、$ HOME/.Xdefault -hostname、YMMVに配置する必要があります)

MYXTerm*foreground: red;
MYXTerm*color11: navyblue;

必要に応じて(不明ですが、システムによって異なります)、xrdb -mergeを使用してファイルをロードします。その後、次のコマンドで端末を起動します。

xterm -class MYXTerm

これで、通常の色に影響を与えないプライベートカラーのセットを備えた端末ができました。さて、あなたが望むのがあなたのプログラムを同じターミナルに実行することであるなら、私は本当にそれをする方法を知りません...

0
Rmano