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.

War es hilfreich?

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:

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/

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top