現在のxtermの背景色へのプログラムによるアクセス?


13

.bashrc前景と背景に使用している色に応じてプロンプトの色を設定したいと思います。

たとえば、背景が明るい場合は青色のプロンプト、暗い場合はベージュのプロンプトが表示されます。

スクリプトの現在の設定を確認する方法はありますか?

回答:


22

Thomas Dickey(xtermのメンテナー)からの返信メールにはこれがあります。特にについての部分に注意してください?Ps = 4指し、OSC Ps ; Pt STどこOSCで(「オペレーティングシステムの制御」接頭辞)ESC ]ST(「文字列ターミネーター」接尾辞)です\(バックスラッシュ)。これ4は、OSCの可能なサブコマンドの1つです。

パレット全体では、88/256カラー拡張を使用して設定/取得できます。ctlseqs.txtでは、次のように要約されています。

  Ps = 4 ; c ; spec -> Change Color Number c to the color
specified by spec.  This can be a name or RGB specification as
per XParseColor.  Any number of c/spec pairs may be given.
The color numbers correspond to the ANSI colors 0-7, their
bright versions 8-15, and if supported, the remainder of the
88-color or 256-color table.

If a "?" is given rather than a name or RGB specification,
xterm replies with a control sequence of the same form which
can be used to set the corresponding color.  Because more than
one pair of color number and specification can be given in one
control sequence, xterm can make more than one reply.

少し後にドキュメントよりOSCサブコマンドであるPs = 10Ps = 11、等。

Ps = 1 0  -> Change VT100 text foreground color to Pt.
Ps = 1 1  -> Change VT100 text background color to Pt.

例-これはPs = "11"(上から)を使用してバックグラウンドを照会しPt = "?"、にプラグインしますOSC Ps ; Pt ST。エコーで\033は、エスケープと\\最後のバックスラッシュに使用されています。

echo -en "\033]11;?\033\\"

出力:

^[]11;rgb:0000/0000/0000^[\ 

警告:返される色は、などのリバースビデオ-rvが有効になっているかどうかを反映しておらず、を介しOSC 4 ; c ; ? STて利用可能な〜260色をクロールしても、バックグラウンドに追従せず、リバースビデオで変更することも表示されません。多くのユーザーがjustを使用して暗い背景を設定するためxterm -rv、背景が実際に暗いかどうかを判断するのが難しくなります。ほとんどの色はにも調整されません-rv

完全なクエリを実行し、実際にxtermから応答をキャプチャするスクリプト:

#!/bin/bash
success=false
exec < /dev/tty
oldstty=$(stty -g)
stty raw -echo min 0
col=11      # background
#          OSC   Ps  ;Pt ST
echo -en "\033]${col};?\033\\" >/dev/tty  # echo opts differ w/ OSes
result=
if IFS=';' read -r -d '\' color ; then
    result=$(echo $color | sed 's/^.*\;//;s/[^rgb:0-9a-f/]//g')
    success=true
fi
stty $oldstty
echo $result
$success

1
うわー... 2年後の応答...ありがとうございます。私は説明をよく理解していませんでしたが、この例は私には何もしません...何もエコーしません。
悲惨な変数

へえ。かなり最近のxterm(実際のxterm)で再実行していますが、今回はすべてのXリソースが削除されています(つまり、すべての「0」ではなく、すべての「f」が生成されます)。/ bin / echoまたはbashの組み込みエコーのいずれかを使用するとうまく機能します。私が試した例は、上記の投稿から直接コピー/貼り付けました。私の環境はUbuntu 11.10(Linux / Debian派生)です。テストするのに便利な別のOSはありません。
アレックスノースキーズ

プロンプトの設定方法によっては、クエリへの応答として端末に入力を詰め込もうとするxtermの試行の上に着陸する可能性があります。シェルの観点から見ると、xtermの返信は、あなたと同じように入力します。
アレックスノースキーズ

1
うーん、Ubuntu 12.04のgnome端末はxterm互換であると主張していますが、何も出力しません。何故ですか?
ニックレイマン

1
今、これは純粋なターミナルブードゥー教です。素晴らしい答え。
Qix-モニカは14年

0

やや

設定を〜/ .Xdefaultsファイルに入れます:

xterm*foreground: blue
xterm*background: white

シェルで値をgrepするだけです:

awk '/xterm\*foreground:(.*)/ { print $2 }' < .Xdefaults

それ以外の場合、xtermの内部値を取得するのはかなり困難です。


Xも使用していません:) Xサーバーなしで実行されるcygwinのrxvtを使用しています。それに加えて、さまざまなホストでさまざまなタスクにさまざまな色を使用できるようにしたいと考えています。そのためには、termincalに設定を照会する必要があります。
悲惨な変数

まあ、あなたはあなたのOSを指定しなかった:)

ごめんなさい 指定しなかった理由は、解決策がいくつかのマジックストリングのエコーに基づいており、stdoutで情報を取得することを期待していたためです。
悲惨な変数

まあ、あなたが「エコー」するものは通常シェル(bash、zsh)内にとどまり、xtermには行きません(コマンドの出力を表示することになる最終ステップを除く)。
アキラ

-1 awkは、このジョブにとって間違ったツールです。
g33kz0r

-1

実際にあなたはこれが欲しいと思う:

% xrdb -query

設定が一覧表示されます。こちらもご覧ください:

http://docstore.mik.ua/orelly/unix3/upt/ch06_08.htm

ランタイムを変更するには、次を使用します。

% echo "some*setting: somevalue" | xrdb -merge

-queryすべてのリソースをリストします。私のubuntuではリソースを指定しても機能しません。
アキラ

「何でも」エコー xrdb -merge
g33kz0r

質問を読み直してください:OPは、xtermの設定に従ってBASH PROMPTの色を設定したいと考えています。OPはxresourcesを変更したくありません。
アキラ

あなたの答えに対する彼のコメントを見てください。彼は「termincal [sic]を照会する」ことを望んでいます。したがって、彼はxrdb -query
g33kz0r

あなたがその特定にしたい場合:彼はWindows上で実行中のxserverなしでrxvtを照会し(これは可能です)、xrdb -queryすべてのリソースのリストを提供します..フォアグラウンドに到達するために再びawk / grepする必要があります。それは私がすでに認めたものです。xrdb -mergeここでcoz OPはxresourcesを変更するのではなく、bashpromptの外観を変更することを望んでいません。
アキラ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.