Xterm-Steuersequenz, um den RGB-Wert für die ANSI-Farbe zu erhalten

1300
Jonas Schubert Erlandsson

Das Fleisch

In (einigen) Terminals können Sie eine Sequenz wie diese verwenden;

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

um die dritte Farbe in der ANSI-Farbpalette auf die durch # CC7833 dargestellten RGB-Werte einzustellen. Kannst du das Gegenteil tun? Kann ich den aktuellen RGB-Wert (in irgendeiner Form) der dritten (naja, wirklich) Farbe bekommen?

Warum?

Der Grund, warum Sie dies tun möchten, besteht in meinem Fall darin, die gesamte Farbtabelle speichern zu können, bevor Sie sie (absichtlich) durcheinander bringen. Ich möchte in der Lage sein, Code im Terminal mit einem RGB-exakten Farbschema aufzulisten. Dazu muss ich die Farbdefinitionen in der Terminal-Farbtabelle wie oben überschreiben.

Für mich ist das Problem jetzt gelöst. Da ich diese Funktionalität jedoch zu einem vorhandenen Open Source-Projekt ("Pry") hinzufügen möchte, das von vielen Leuten verwendet wird, muss ich den aktuellen Status der Farbpalette speichern können, bevor Sie die Designfarben für die Programmsitzung festlegen und dann wechseln zurück nach.

Ich weiß, dass einige Terminals dies in den Einstellungen haben und einige Systeme haben es in Konfigurationsdateien. Aber ich brauche etwas, das allgemein ist und systemübergreifend funktionieren würde. Idealerweise alle Systeme, die die Einstellung in der oben genannten Weise unterstützen :)

Bonus

Im Moment wirkt sich das Wechseln der Farben auf das gesamte System und alle Terminalsitzungen aus, selbst nachdem das Terminal geschlossen und neu gestartet wurde (dies verwendet iTerm2 unter OS X Mountain Lion).

Wenn der Effekt lokal gemacht werden könnte, beispielsweise in eine Sub-Shell, würde das Problem behoben werden, da die Änderungen mit der Sub-Shell zum Ende des Prozesses abbrechen würden. Besser noch, da es vor Fällen schützen würde, in denen die Sitzung abstürzte ...

3

3 Antworten auf die Frage

2
tgood

Die einer Standardmethode hierfür am nächsten kommende Methode wäre, sich auf xrdb zu verlassen. Sie xrdb -querykönnen die von der aktuellen X-Sitzung verwendeten Farbwerte verwenden und abrufen. Zum Beispiel bietet mir Folgendes:

* Hintergrund: # 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 * Vordergrund: # D7D0C7 ... 

Aufgrund der Funktionsweise von xrdb ist mir leider keine Möglichkeit bekannt, nur Einstellungen für eine Sub-Shell festzulegen, da der gesamte Punkt von xrdb darin besteht, Einstellungen für die aktuelle x-Sitzung zu koordinieren. Sie können jedoch "hacken", indem Sie die Einstellungen über exportieren xrdb -queryund sie anschließend erneut laden, wenn Sie fertig sind.

Dies ist nur bei Systemen möglich, die X11 oder die gleichen Tools verwenden. Es funktioniert nicht auf OS X oder anderen Linux-Anzeigeservern wie Wayland oder Mir. Jonas Schubert Erlandsson vor 10 Jahren 0
Ah ja. Es tut mir leid - ich habe angenommen, dass OS X aus irgendeinem Grund X verwendet hat. tgood vor 10 Jahren 0
2
egmont

Sie können die Farbe mit abfragen

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

Dadurch wird die Antwort in den Tastaturpuffer gestellt, als ob Sie sie in das Terminal eingegeben hätten (was in Shell-Skripts schwer zu verarbeiten ist). Oder du kannst verwenden

xtermcontrol --get-color3 

das ein Convenience-Frontend mit dieser Escape-Sequenz.

0
Rmano

Die klassische Methode, die ich verwendete, bestand darin, eine Reihe von xrdb-Eigenschaften für eine neue Klasse zu definieren - wie folgt: (In Linux muss man sie in $ HOME / .Xdefault- hostname, YMMV einfügen)

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

und wenn nötig (nicht sicher, hängt vom System ab) lädt die Datei mit xrdb -merge. Danach starten Sie ein Terminal mit:

xterm -class MYXTerm 

Jetzt sollten Sie ein Terminal mit privaten Farben haben, die die normalen nicht beeinflussen. Wenn Sie nun Ihr Programm auf demselben Terminal ausführen möchten, weiß ich nicht, wie es geht ...

Dies ist nur bei Systemen möglich, die X11 oder die gleichen Tools verwenden. Es funktioniert nicht auf OS X oder anderen Linux-Anzeigeservern wie Wayland oder Mir. Jonas Schubert Erlandsson vor 10 Jahren 0