Come determinare il colore di sfondo di un terminale?
-
22-09-2019 - |
Domanda
Vorrei sapere se esiste un modo per determinare il colore di sfondo di un terminale?
Nel mio caso, usando gnome-terminal.
Potrebbe avere importanza, dal momento che spetta interamente all'applicazione terminale disegnare lo sfondo delle sue finestre, che potrebbe anche essere qualcosa di diverso da un colore semplice.
Soluzione
Sono venuto con la seguente:
#!/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/]\+$//'
Fonte / Repo / Gist: https://gist.github.com/blueyed/c8470c2aad3381c33ea3
Altri suggerimenti
C'è un controllo xterm sequenza per questo:
\e]11;?\a
(\e
e \a
sono CES e caratteri BEL, rispettivamente.)
terminale xterm-compatibile dovrebbero rispondere con la stessa sequenza, con il punto interrogativo sostituito da un colorspec X11, ad esempio rgb:0000/0000/0000
per il nero.
A parte apparentemente rxvt-solo $ COLORFGBG , io sono non conoscenza del fatto che qualsiasi altra cosa esiste anche. Per lo più le persone sembrano essere riferendosi a come vim fa , e anche che è un'ipotesi al meglio.
Alcuni link:
- Codice di escape Xterm:
- http://www.talisman.org/~erlkonig/documents/xterm-color-queries/
- https://invisible-island.net/xterm/ctlseqs/ctlseqs.html (colori dinamici/Richiedi Termcap/Stringa Terminfo)
- http://thrysoee.dk/xtermcontrol/ (
xtermcontrol --get-bg
) - https://gist.github.com/blueyed/c8470c2aad3381c33ea3
- https://github.com/rocky/bash-term- background/blob/master/term- background.sh
COLORFGBG
variabile d'ambiente (usata da Rxvt ma non da molti altri...):
È impostato su qualcosa del genere<foreground-color>:[<other-setting>:]<background-color>
, (<other setting>:
è facoltativo) e if<background-color>
in {0,1,2,3,4,5,6,8}, quindi abbiamo uno sfondo scuro.- Vim:
- Emac...(modalità background) (penso che utilizzi il codice escape)
- Domande/rapporti/discussioni correlate:
- C'è un modo per determinare il colore di sfondo di un terminale?
- Come fa Vim a indovinare il colore di sfondo su 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
Per esempio.alcuni frammenti correlati da Numero Neovim 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";
}
Di COLORFGBG
env, da Gnomo BugZilla 733423:
Dei parecchi terminali che ho appena provato su Linux, solo urxvt e konsole lo impostano (quelli che non lo fanno:xterm, st, terminologia, pterm).Konsole e Urxvt utilizzano sintassi e semantica diverse, ad es.per me la konsole lo imposta su "0;15" (anche se utilizzo lo schema di colori "Nero su giallo chiaro" - quindi perché non "default" invece di "15"?), mentre il mio urxvt lo imposta su "0;default ;15" (in realtà è nero su bianco - ma perché tre campi?).Quindi in nessuno di questi due il valore corrisponde alle tue specifiche.
Questo è un codice che sto usando (attraverso):
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)
Vuoi dire un metodo per accertare il colore di sfondo del terminale, o impostare il colore del terminale?
In quest'ultimo caso si potrebbe interrogare variabile d'ambiente PS1 del terminale per ottenere il colore.
C'è un articolo su come configurare (e quindi derivare) i colori del terminale qui: http://www.ibm.com/developerworks/linux/library / l-tip-rapida /