Wie kann ich die Hintergrundfarbe eines Terminals bestimmen?
-
22-09-2019 - |
Frage
Ich möchte wissen, ob es eine Möglichkeit gibt, die Hintergrundfarbe eines Terminals zu bestimmen?
In meinem Fall mit Gnom-terminal.
Es könnte eine Rolle spielen, da es bis zur Terminalanwendung vollständig ist, den Hintergrund seiner Fenster zu zeichnen, was sogar etwas anderes als eine einfache Farbe sein kann.
Lösung
Ich habe Folgendes ausgedacht:
#!/bin/sh
#
# Query a property from the terminal, e.g. background color.
#
# XTerm Operating System Commands
# "ESC ] Ps;Pt ST"
oldstty=$(stty -g)
# What to query?
# 11: text background
Ps=${1:-11}
stty raw -echo min 0 time 0
# stty raw -echo min 0 time 1
printf "\033]$Ps;?\033\\"
# xterm needs the sleep (or "time 1", but that is 1/10th second).
sleep 0.00000001
read -r answer
# echo $answer | cat -A
result=${answer#*;}
stty $oldstty
# Remove escape at the end.
echo $result | sed 's/[^rgb:0-9a-f/]\+$//'
Quelle/Repo/Gist: https://gist.github.com/blueyed/c8470c2aad3381c33ea3
Andere Tipps
Dort ist ein Xterm Kontrollsequenz dafür:
\e]11;?\a
(\e
und \a
sind die ESC- bzw. Bel -Charaktere.)
Xterm-kompatible Terminals sollten mit derselben Sequenz antworten, wobei das Fragezeichen durch einen x11 ColorSpec ersetzt wird, z. B. rgb:0000/0000/0000
für Schwarz.
Abgesehen von Anscheinend rxvt $ $ colorfgbg, Ich bin mir nicht bewusst, dass überhaupt etwas existiert. Meistens scheinen die Leute zu sein in Bezug auf wie Vim macht es, Und selbst das ist bestenfalls eine gebildete Vermutung.
Einige Links:
- Xterm Escape Code:
- http://www.talisman.org/~erlkonig/documents/xterm-
- https://invisible-island.net/xterm/ctlseqs/ctlseqs.html (Dynamische Farben / Anfrage TermCap / Terminfo String)
- http://thhrysoee.dk/xtermcontrol/ (
xtermcontrol --get-bg
) - https://gist.github.com/blueyed/c8470c2aad3381c33ea3
- https://github.com/rocky/bash-m-m-background/blob/master/term-background.sh
COLORFGBG
Umgebungsvariable (verwendet von RXVT, aber nicht vielen anderen ...):
Es ist auf sth wie<foreground-color>:[<other-setting>:]<background-color>
, (<other setting>:
ist optional) und wenn<background-color>
In {0,1,2,3,4,5,6,8} haben wir einen dunklen Hintergrund.- Vim:
- EMACS ... (Hintergrundmodus) (Ich denke, es verwendet den Escape Code)
- Verwandte Fragen / Berichte / Diskussionen:
- Gibt es eine Möglichkeit, die Hintergrundfarbe eines Terminals zu bestimmen?
- Wie erraten Vim Hintergrundfarbe auf Xterm?
- https://unix.stackexchange.com/questions/245378/common-environment-variable-to-set-dark-or-light-terminal-background
- https://bugzilla.gnome.org/show_bug.cgi?id=733423
- https://github.com/neovim/neovim/issues/2764
ZB ein verwandtes Snippet von Neovim Ausgabe 2764:
/*
* Return "dark" or "light" depending on the kind of terminal.
* This is just guessing! Recognized are:
* "linux" Linux console
* "screen.linux" Linux console with screen
* "cygwin" Cygwin shell
* "putty" Putty program
* We also check the COLORFGBG environment variable, which is set by
* rxvt and derivatives. This variable contains either two or three
* values separated by semicolons; we want the last value in either
* case. If this value is 0-6 or 8, our background is dark.
*/
static char_u *term_bg_default(void)
{
char_u *p;
if (STRCMP(T_NAME, "linux") == 0
|| STRCMP(T_NAME, "screen.linux") == 0
|| STRCMP(T_NAME, "cygwin") == 0
|| STRCMP(T_NAME, "putty") == 0
|| ((p = (char_u *)os_getenv("COLORFGBG")) != NULL
&& (p = vim_strrchr(p, ';')) != NULL
&& ((p[1] >= '0' && p[1] <= '6') || p[1] == '8')
&& p[2] == NUL))
return (char_u *)"dark";
return (char_u *)"light";
}
Um COLORFGBG
env, von Gnome Bugzilla 733423:
Aus einigen Terminals habe ich gerade unter Linux ausprobiert, nur Urxvt und Konsole haben es (diejenigen, die nicht: Xterm, ST, Terminologie, Pterm) festgelegt haben. Konsole und Urxvt verwenden verschiedene Syntax und Semantik, dh für mich setzt Konsole es auf "0; 15" (obwohl ich das Farbschema "Schwarz auf hellgelb" verwende - warum also nicht "Standard" anstelle von "15"?), Während mein urxvt es auf "0; Standard; 15" setzt (es ist tatsächlich schwarz auf Weiß - aber warum drei Felder?). In keinem dieser beiden stimmt der Wert mit Ihrer Spezifikation überein.
Dies ist ein eigener Code, den ich verwende (über):
def is_dark_terminal_background():
"""
:return: Whether we have a dark Terminal background color, or None if unknown.
We currently just check the env var COLORFGBG,
which some terminals define like "<foreground-color>:<background-color>",
and if <background-color> in {0,1,2,3,4,5,6,8}, then we have some dark background.
There are many other complex heuristics we could do here, which work in some cases but not in others.
See e.g. `here <https://stackoverflow.com/questions/2507337/terminals-background-color>`__.
But instead of adding more heuristics, we think that explicitly setting COLORFGBG would be the best thing,
in case it's not like you want it.
:rtype: bool|None
"""
if os.environ.get("COLORFGBG", None):
parts = os.environ["COLORFGBG"].split(";")
try:
last_number = int(parts[-1])
if 0 <= last_number <= 6 or last_number == 8:
return True
else:
return False
except ValueError: # not an integer?
pass
return None # unknown (and bool(None) == False, i.e. expect light by default)
Meinen Sie eine Methode, um die terminale Hintergrundfarbe zu ermitteln oder die terminale Farbe festzulegen?
Wenn Sie letzteres die PS1 -Umgebungsvariable Ihres Terminals abfragen, um die Farbe zu erhalten.
Hier gibt es einen Artikel über das Einstellen (und so abgeleitet) die Terminalfarben hier:http://www.ibm.com/developerworks/linux/library/l-l-lp-prompt/