Wie ermittle ich die aktuelle Farbe der Konsolenausgabe?

14

Ich weiß, dass man, wenn ein farbiges Terminal verfügbar ist, die Ausgabe mit Escape-Zeichen einfärben kann .

Aber gibt es eine Möglichkeit herauszufinden, in welcher Farbe die Ausgabe aktuell angezeigt wird? Oder besser, welche Farbe hätte der Text, wenn ich ihn jetzt ausgeben würde?

Ich bitte Sie, bei Verwendung dieser Escape-Zeichen keine vorherigen Farbeinstellungen zu ändern. Das Escape-Zeichen "Standardvordergrundfarbe" bezieht seine Informationen aus dem Farbschema und nicht aus der Textfarbe, bevor ich sie geändert habe.

Minix
quelle
Bei den Variablen termcap und terminfo scheint dies nicht möglich zu sein. Sie können beispielsweise die Anzahl der Farben abrufen, die Ihr Terminal mit echotc Cooder unterstützt echoti colors, aber es gibt einfach keine Variable, in der die aktuelle Farbcodedefinition gespeichert ist.
Jimmy
@jimmij Ich dachte schon und hoffte, dass ich etwas verpasst habe. Wenn Sie sicher sind, dass dies nicht möglich ist, machen Sie eine Antwort und ich werde sie irgendwann akzeptieren, wenn nichts anderes folgt. Vielen Dank für Ihre Zeit.
Minix

Antworten:

10

Im Allgemeinen ist es nicht möglich, die aktuellen Farben zu erhalten. Die Ablaufsteuerung eines Terminals erfolgt "innerhalb" des Terminals, wo immer sich das gerade befindet. Mit einem Terminal - Emulator wie xtermoder einem in einen Betriebssystemkern aufgebaut , dass der Kernel virtuelles Terminals bereitstellt, den internen Zustand des Emulators, einschließlich seiner Vorstellung von dem aktuellen „Darstellungsart“ (dh Farbe und Eigenschaften), ist an der Maschine selbst und ist theoretisch zugänglich. Bei einem realen Terminal befinden sich diese Informationen jedoch an einem bestimmten RAM-Speicherort auf einem physisch getrennten Computer, der über eine serielle Verbindung verbunden ist.

Das heißt, einige Terminals enthalten einen Mechanismus zum Auslesen solcher Informationen als Teil ihres Terminalprotokolls, das über diese serielle Verbindung gesendet wird. Sie bieten Kontrollsequenzen , die ein Programm an das Endgerät senden kann, dass es Grund zu zurücks Informationen über seinen internen Zustand, als Terminal - Eingang. mikeservhat Ihnen die Steuersequenzen gezeigt, auf die der xtermTerminalemulator reagiert. Aber diese sind spezifisch für xterm. Die im Linux-Kernel integrierten Terminal-Emulatoren und die verschiedenen BSD-Kernel sind beispielsweise unterschiedliche Terminaltypen und implementieren überhaupt keine derartigen Steuersequenzen. Gleiches gilt für ganze Familien von realen Terminals.

DEC VT525-Terminals implementieren einen Auslesemechanismus, verfügen jedoch über eine Reihe von Steuersequenzen, die in keiner Beziehung zu den von verwendeten Sequenzen stehen xterm. Man sendet die DECRQSS-Sequenz (Request Selection or Setting), um die aktuelle Grafikwiedergabe anzufordern, und das Terminal antwortet mit dem Senden der DECRPSS-Sequenz (Report Selection or Setting). Speziell:

  1. Host sendet: DCS $ q mST (DECRQSS mit dem Steuerfunktionsteil von SGR als Einstellung)
  2. Terminal antwortet: DCS 0 $ r 0 ; 3 3 ; 4 4 mST (DECRPSS mit den Parametern und Steuerfunktionen einer SGR-Steuersequenz, die die aktuellen Vordergrund- und Hintergrundfarben festlegt)

Natürlich zeigt eine sorgfältige Lektüre Ihrer Frage, dass Sie in diesen europäischen Währungssystemen wieder mit einer Banane mit Schokoladenüberzug winken. Was Sie tatsächlich versuchen, für das Sie eine Lösung ausgewählt und dann gefragt haben, wie Sie einen Teil dieser Lösung ausführen möchten , ist , den vorherigen Status beizubehalten, während Sie eine farbige Ausgabe schreiben. Dazu gibt es nicht nur eine DEC VT-Steuersequenz, sondern auch eine SCO-Konsolenterminalsequenz, die von xtermverschiedenen im Kernel integrierten Terminalemulatoren erkannt wird , und einen Eintrag termcap / terminfo, der angibt, was sie für Ihr Terminal sind.

Die termcap-Einträge sind scund rc. Die Terminfo-Einträge sind save_cursorund restore_cursor. Die Namen sind in ihrer Wirkung etwas irreführend (obwohl sie als Warnung dienen, dass Sie sich auf etwas verlassen, das de facto und nicht de jure ist ). Die tatsächlichen Steuersequenzen DECSC, DECRC, SCOSC und SCORC speichern und stellen auch die aktuelle Grafikwiedergabe wieder her.

In dem Artikel, auf den Sie verwiesen haben, geht es darum, Steuersequenzen aus Shell-Skripten zu generieren. Der Befehl, nach dem Sie jetzt suchen, lautet tput:

Weitere Lektüre

JdeBP
quelle
Gute Antwort. Ich bin froh, dass ich zurückgekommen bin. Danke vielmals.
Minix
@Minix - neben scund rcmöchten Sie möglicherweise auch in den alternativen Puffer schauen, wenn Ihr Terminal dies unterstützt. Und ja, das ist eine großartige Antwort. Minix, vielleicht auch so aussehen: wie Sie mit / dev / fb0 als Konsole von Anwenderseite . Die noshSuite, die er empfiehlt, ist seine eigene.
mikeserv
@mikeserv Ich werde einen Blick darauf werfen, danke für die Links :)
Minix
2
Es wurde bemerkt, dass dies "keine Beziehung zu den von xterm verwendeten hat" - jedoch wird DECRQSS von xterm seit einiger Zeit unterstützt. Der Teil mit SGR-Antwort einschließlich Farbe stammt aus dem Jahr 1996.
Thomas Dickey
2
Siehe Weiterführende Literatur , in xterm Kontrolle-Sequenzen Dokumentation, die darauf hinweisen , dass die VT520 / etc Dokumentation nicht verfügbar war , als xterm Farben in begann die Bereitstellung DECRQSS(etwa 7 Jahre verzögern ...).
Thomas Dickey
10

In xtermkönnen Sie die aktuellen RGB-Farbcodes abrufen, indem Sie ein Farbänderungs-Escape in eine Abfrage ändern. Verwenden Sie das ESC ] Ps m-, aber fügen Sie ein ?Fragezeichen hinzu. Aus den Dokumenten :

  • Wenn a "?"anstelle eines Namens oder einer RGB-Spezifikation angegeben wird, wird xtermmit einer Kontrollsequenz der gleichen Form geantwortet, mit der die entsprechende dynamische Farbe eingestellt werden kann. Da mehr als ein Paar von Farbnummer und Spezifikation in einer Kontrollsequenz angegeben werden xtermkann , kann mehr als eine Antwort erfolgen.
    • P s = 1 0 → Ändern Sie die Vordergrundfarbe des VT100-Texts in P t.
    • P s = 1 1 → Ändern Sie die VT100-Texthintergrundfarbe in P t.
    • P s = 1 2 → Ändern Sie die Farbe des Textcursors auf P t.
    • P s = 1 3 → Ändern Sie die Vordergrundfarbe der Maus in P t.
    • P s = 1 4 → Ändern Sie die Hintergrundfarbe der Maus in P t.
    • P s = 1 5 → Ändern Sie die Vordergrundfarbe von Tektronix in P t.
    • P s = 1 6 → Ändern Sie die Hintergrundfarbe von Tektronix in P t.
    • P s = 1 7 → Ändern Sie die Hintergrundfarbe der Hervorhebung auf P t.
    • P s = 1 8 → Ändern Sie die Farbe des Tektronix-Cursors in P t.
    • P s = 1 9 → Ändern Sie die Vordergrundfarbe der Hervorhebung in P t.

Ich habe ernsthafte Zweifel, ob dies wahrscheinlich in einem anderen Terminal-Emulator funktioniert, aber in einem, xtermwenn Sie ...

printf '\033]11;?\007'

... das xtermwird eine Sequenz wie die folgende in den Eingabepuffer Ihres Terminals zurückschieben ...

11;rgb:ffff/ffff/ffff

... für den Hintergrund oder für den Vordergrund:

printf '\033]10;?\007'

10;rgb:0000/0000/0000
mikeserv
quelle
Wenn ich also starte printf '\033]10;rgb:8f8f/8f8f/8f8f8f\007, färbt sich der gesamte Text im Terminal, der zuvor "normal" war, hellblau. Anschließend wird beim Ausführen der printf '\033]10;rgb:bfbfbf/bfbfbf/bfbfbf\007'gesamte hellblaue Text auf "normal" zurückgesetzt. Wie verwende ich diesen Wert, um nur die Farbe des Textes in der Zukunft zu ändern?
15.
@fourpastmidnight: vielleicht clearzuerst?
mikeserv
Ich glaube, ich verstehe die Dokumentation nicht. Es steht eindeutig "P s = 1 0 -> VT100-Vordergrundfarbe ändern", und nun, genau das scheint es zu tun. ;) Aber das habe ich nicht erwartet. Möglicherweise muss der RGB-Wert verwendet werden, der aus "P s = 1 0; Pt =?" mit einem anderen entkommenen Befehl zu erreichen, was ich will.
Vormittags,
Ok, also printf '\033]10;?\007'fragt xterm nach der aktuellen Vordergrundfarbe des Terminals. Wenn Ihr Terminal mit "normal" gestartet wurde (z. B. 7 als Vordergrundfarbe), Sie aber tput setaf 3vor dem Ausführen des printfBefehls ausgeführt haben, gibt der printfobige Befehl weiterhin "normal" zurück - und das ist richtig, da dies die aktuelle Vordergrundfarbe Ihres Terminals ist. Was ich gehofft hatte, war eine Möglichkeit, die aktuelle Farbe der aktuellen Cursorposition abzurufen, damit ich sie abspeichern und später "wiederherstellen" konnte - wie im OP.
Vormittags,
1
@fourpastmidnight - bist du dem Link in der Antwort hier gefolgt? auch Thomas Dickey - (er hat die andere Antwort auf diese Frage kommentiert) ist xtermder Betreuer und hier ein aktives Mitglied. (der link ist zu seiner website - xtermdie escape docs sind umfangreich - und im
grunde