Programmatischer Zugriff auf die aktuelle xterm Hintergrundfarbe?

13

Ich möchte die Eingabeaufforderungsfarben in .bashrcAbhängigkeit von den Farben einrichten, die für Vordergrund und Hintergrund verwendet werden.

Beispiel: Blaue Eingabeaufforderung bei hellem Hintergrund und Beige bei Dunkelheit.

Gibt es eine Möglichkeit, die aktuellen Einstellungen in einem Skript herauszufinden?

Elende Variable
quelle

Antworten:

22

Die E-Mail von Thomas Dickey (Betreuer von xterm) hat dies. Beachten Sie insbesondere den Teil über ?. Das Ps = 4bezieht sich darauf, OSC Ps ; Pt STwo OSC(das Präfix "Operating System Control") ESC ]und ST(das Suffix "String Terminator") \(Backslash) ist. Das 4ist eine der möglichen Subbefehle zu OSC.

Für die gesamte Palette kann dies mit der Farberweiterung 88/256 festgelegt / abgerufen werden. In ctlseqs.txt ist es hier zusammengefasst:

  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.

Etwas später in den Dokumenten finden Sie weitere OSC-Unterbefehle Ps = 10und Ps = 11und andere.

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

Beispiel - Dies fragt den Hintergrund mit Ps = "11"(von oben) und Pt = "?", eingesteckt in die OSC Ps ; Pt ST. Im Echo \033wird für die Flucht und \\für den letzten Backslash verwendet.

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

Ausgabe:

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

Warnung: Die zurückgegebene Farbe gibt nicht an, ob das umgekehrte Video wie -rvaktiviert ist, und das Crawlen durch die über ~ 260 verfügbaren Farben OSC 4 ; c ; ? STzeigt keine an, die beide dem Hintergrund folgen UND sich mit dem umgekehrten Video ändern. Da viele Benutzer mit just einen dunklen Hintergrund xterm -rvfestlegen, erschwert dies die Feststellung, ob der Hintergrund tatsächlich dunkel ist oder nicht. Die meisten Farben passen sich auch nicht an -rv.

Ein Skript, mit dem die vollständige Abfrage ausgeführt und die Antwort von xterm erfasst werden kann:

#!/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
Alex North-Keys
quelle
1
Wow ... eine Antwort nach zwei Jahren ... danke. Ich habe die Erklärung nicht ganz verstanden, aber das Beispiel tut nichts für mich ... gibt nichts wieder.
Variable
Heh. Ich führe es in einem ziemlich neuen xterm - einem tatsächlichen xterm - erneut aus, diesmal mit all meinen X-Ressourcen (was bedeutet, dass es alle "f" für die Farben anstelle aller "0" gibt). Die Verwendung von / bin / echo oder dem eingebauten Echo von bash funktioniert einwandfrei. Das Beispiel, das ich ausprobiert habe, wurde direkt aus dem obigen Beitrag kopiert / eingefügt. Meine Umgebung ist Ubuntu 11.10 (ein Linux / Debian-Derivat). Ich habe kein anderes Betriebssystem zum Testen zur Hand.
Alex North-Keys
Abhängig davon, wie Ihre Eingabeaufforderung konfiguriert ist, besteht die Möglichkeit, dass sie zusätzlich zu dem Versuch von xterm landet, als Antwort auf Ihre Anfrage Eingaben in Ihr Terminal zu übertragen. Aus der Sicht Ihrer Shell sieht die Antwort von xterm genauso aus wie Sie, wenn Sie tippen.
Alex North-Keys
1
Hmm, das Gnome-Terminal in Ubuntu 12.04 behauptet, xterm-kompatibel zu sein, druckt aber nichts zurück. Warum das?
Nik Reiman
1
Nun dies ist reiner Terminal Voodoo. Hervorragende Antwort.
Qix - MONICA wurde
0

So'ne Art

Fügen Sie die Einstellungen in Ihre ~ / .Xdefaults-Datei ein:

xterm*foreground: blue
xterm*background: white

In deiner Shell grepst du einfach nach den Werten:

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

Andernfalls ist es ziemlich schwierig, einige interne Werte des xterm zu erhalten.

Akira
quelle
Ich benutze nicht einmal X :) Ich benutze einen RXVT von Cygwin, der ohne X-Server läuft. Außerdem möchte ich in der Lage sein, verschiedene Farben auf verschiedenen Hosts und für verschiedene Aufgaben zu verwenden, was erfordert, dass ich den Begriff nach Einstellungen abfrage.
Elende Variable
Nun, Sie haben Ihr Betriebssystem nicht angegeben :)
Akira
Das tut mir leid. Der Grund, den ich nicht angegeben habe, ist, dass ich erwartet hatte, dass die Lösung auf dem Echo einiger magischer Zeichenfolgen basiert und einige Informationen über stdout zurückerhält.
Elende Variable
Nun, was Sie "echo" normalerweise in der Shell bleiben (bash, zsh), geht nicht zu xterm (außer im letzten Schritt, wenn es darum geht, die Ausgabe der Befehle anzuzeigen).
Akira
-1 awk ist das falsche Werkzeug für den Job.
g33kz0r
-1

Eigentlich denke ich, dass du das willst:

% xrdb -query

Dadurch werden die Einstellungen für Sie aufgelistet. Siehe auch:

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

Verwenden Sie zum Ändern der Laufzeit Folgendes:

% echo "some*setting: somevalue" | xrdb -merge
g33kz0r
quelle
-querylistet alle Ressourcen auf. Die Angabe einer Ressource funktioniert auf meinem Ubuntu nicht.
Akira
echo "was auch immer" | xrdb -merge
g33kz0r
Lesen Sie die Frage erneut: OP möchte die Farben des BASH PROMPT gemäß den Einstellungen des xterm einstellen. OP möchte die xresources nicht ändern.
Akira
Siehe seinen Kommentar zu Ihrer Antwort. Er will "den Begriff abfragen". Also will er xrdb -query
g33kz0r
Wenn Sie so spezifisch sein möchten: Er möchte rxvt ohne einen laufenden xserver unter Windows abfragen (was möglich ist) und xrdb -querygibt Ihnen nur die Liste aller Ressourcen. Sie müssen erneut awk / grep, um in den Vordergrund zu gelangen. und das habe ich schon zugegeben. xrdb -mergeist hier völlig offtopisch, weil OP nicht die xresources ändern will, sondern das Erscheinungsbild der Bashprompt.
Akira