سؤال

أود أن أعرف ما إذا كان هناك أي طريقة لتحديد لون خلفية المحطة؟

في حالتي ، باستخدام طرف جنوم.
قد يكون الأمر مهمًا ، نظرًا لأن الأمر يتصاعد إلى التطبيق الطرفي لرسم خلفية النوافذ الخاصة به ، والتي قد تكون شيئًا آخر غير اللون العادي.

هل كانت مفيدة؟

المحلول

لقد توصلت إلى ما يلي:

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

المصدر/repo/gist: https://gist.github.com/blueyed/c8470c2aad3381c333ea3

نصائح أخرى

هناك تسلسل التحكم في Xterm لهذا:

\e]11;?\a

(\e و \a هي شخصيات ESC و BEL ، على التوالي.)

يجب أن ترد المحطات المتوافقة مع Xterm بنفس التسلسل ، مع استبدال علامة الاستفهام بـ X11 Colorpec ، على سبيل المثال rgb:0000/0000/0000 للأسود.

بجانب من يبدو أن RXVT-only $ colorfgbg, ، لا أدرك أن أي شيء آخر موجود. في الغالب يبدو أن الناس بالاشارة الى كيف vim يفعل ذلك, ، وحتى هذا تخمين متعلم في أحسن الأحوال.

بعض الروابط:

مثل بعض المقتطفات ذات الصلة من قضية 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";
}

حول COLORFGBG بيئة ، من Gnome Bugzilla 733423:

من بين عدد قليل من المحطات المحطات التي جربتها للتو على Linux ، فقط URXVT و Konsole قاموا بتعيينه (تلك التي لا: يستخدم 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 <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)

هل تقصد طريقة للتأكد من لون الخلفية الطرفية ، أو ضبط اللون الطرفي؟

إذا كان بإمكانك الاستعلام عن متغير بيئة PS1 الخاص بمحطة المحطة الخاصة بك للحصول على اللون.

هناك مقال عن الإعداد (واشتقاق) الألوان الطرفية هنا:http://www.ibm.com/developerworks/linux/library/l-tip-prompt/

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top