Есть ли способ определить цвет фона терминала? - PullRequest
16 голосов
/ 24 марта 2010

(не уверен, принадлежит ли этот вопрос здесь или суперпользователю)

Хотелось бы узнать, есть ли способ определить цвет фона терминала?

В моем случае используется gnome-терминал.
Это может иметь значение, поскольку приложение терминала может рисовать фон своих окон, который может даже быть чем-то иным, чем простым цветом.

Ответы [ 5 ]

12 голосов
/ 14 октября 2011

Для этого есть последовательность управления xterm :

\e]11;?\a

(\e и \a - символы ESC и BEL соответственно.)

Терминалы, совместимые с Xterm, должны отвечать в той же последовательности, причем знак вопроса заменяется на цветовую спецификацию X11, например, rgb:0000/0000/0000 для черного.

6 голосов
/ 30 мая 2015

Я придумал следующее:

#!/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/]\+$//'

Источник / Репо / Суть: https://gist.github.com/blueyed/c8470c2aad3381c33ea3

1 голос
/ 12 февраля 2019

Некоторые ссылки:

например. некоторый связанный фрагмент из Neovim Issue 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";
}

О COLORFGBG env, от Gnome BugZilla 733423 :

Из нескольких терминалов, которые я только что попробовал на linux, только urxvt и konsole установили его (те, которые не: xterm, st, терминология, pterm). Konsole и Urxvt используют разные синтаксис и семантику, т.е. для меня konsole устанавливает его на «0; 15» (хотя я использую цветовую схему «Черный на светло-желтом» - так почему бы не «по умолчанию» вместо «15»?), тогда как мой urxvt устанавливает его в «0; по умолчанию; 15» (на самом деле он черный на белом - но почему три поля?). Так что ни в одном из этих двух значений значение не соответствует вашей спецификации.

Это некоторый собственный код, который я использую ( через ):

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 </1473847/est-li-sposob-opredelit-tsvet-fona-terminala>`__.
        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)
1 голос
/ 14 октября 2011

Кроме , очевидно, только для rxvt $ COLORFGBG , я не знаю, что еще что-либо существует. В основном люди, кажется, имеют в виду , как vim делает это , и даже в лучшем случае это догадка.

0 голосов
/ 24 марта 2010

Вы имеете в виду метод определения цвета фона терминала или установки цвета терминала?

Если последнее, вы можете запросить переменную окружения PS1 вашего терминала, чтобы получить цвет.

Здесь есть статья по настройке (и получению) цветов терминала: http://www.ibm.com/developerworks/linux/library/l-tip-prompt/

...