Программный доступ к текущему xterm цвету фона?

13

Я хотел бы настроить цвета подсказок в .bashrcзависимости от цветов, которые он использует для переднего плана и фона.

Например, синий подсвечивает, если фон светлый, и бежевый, если он темный.

Есть ли способ узнать текущие настройки в скрипте?

Жалкая переменная
источник

Ответы:

22

Письмо от Томаса Дики (сопровождающего xterm) содержит это. Обратите внимание, в частности, часть о ?. Ps = 4Относится к OSC Ps ; Pt STгде OSC( «Контроль операционной системы» префикс) ESC ]и ST(далее «Строка Terminator» суффикс) является \(обратный слэш). Это 4одна из возможных подкоманд для OSC.

Для всей палитры, которая может быть установлена ​​/ получена с использованием расширения цвета 88/256. В ctlseqs.txt это обобщено здесь:

  Ps = 4 ; c ; spec -> Change Color Number c to the color
specified by spec.  This can be a name or RGB specification as
per XParseColor.  Any number of c/spec pairs may be given.
The color numbers correspond to the ANSI colors 0-7, their
bright versions 8-15, and if supported, the remainder of the
88-color or 256-color table.

If a "?" is given rather than a name or RGB specification,
xterm replies with a control sequence of the same form which
can be used to set the corresponding color.  Because more than
one pair of color number and specification can be given in one
control sequence, xterm can make more than one reply.

Чуть позже в документации появятся еще подкоманды OSC Ps = 10и Ps = 11, и другие.

Ps = 1 0  -> Change VT100 text foreground color to Pt.
Ps = 1 1  -> Change VT100 text background color to Pt.

Пример - это запрос фона с использованием Ps = "11"(чуть выше) и Pt = "?", подключенный к OSC Ps ; Pt ST. В эхо, \033используется для побега и \\для окончательного обратного слеша.

echo -en "\033]11;?\033\\"

Выход:

^[]11;rgb:0000/0000/0000^[\ 

Предупреждение: возвращенный цвет не отражает -rv, включено ли обратное видео, например , и при обходе через ~ 260 цветов, доступных через OSC 4 ; c ; ? ST, не отображаются те, которые следуют фону и изменяются при обратном видео. Поскольку многие пользователи устанавливают темный фон с помощью функции «просто» xterm -rv, это затрудняет определение того, является ли фон темным или нет. Большинство цветов тоже не подстраиваются под -rv.

Скрипт для выполнения полного запроса и фактического получения ответа от xterm:

#!/bin/bash
success=false
exec < /dev/tty
oldstty=$(stty -g)
stty raw -echo min 0
col=11      # background
#          OSC   Ps  ;Pt ST
echo -en "\033]${col};?\033\\" >/dev/tty  # echo opts differ w/ OSes
result=
if IFS=';' read -r -d '\' color ; then
    result=$(echo $color | sed 's/^.*\;//;s/[^rgb:0-9a-f/]//g')
    success=true
fi
stty $oldstty
echo $result
$success
Алекс Норт-Киз
источник
1
Вау ... ответ через два года ... спасибо. Я не совсем понял объяснение, но пример ничего не делает для меня ... ничего не говорит.
Унылая переменная
Хех. Я перезапускаю его в довольно недавнем xterm - фактическом xterm - на этот раз со всеми моими X-ресурсами, которые были удалены (что означает, что он возвращает все «f» для цветов вместо всех «0»). Использование / bin / echo или встроенного эха bash работает нормально. Пример, который я пробовал, был скопирован / вставлен прямо из поста выше. Моя среда - Ubuntu 11.10 (производная от Linux / Debian). У меня нет другой ОС, пригодной для тестирования.
Алекс Норт-Киз
В зависимости от того, как настроено ваше приглашение, есть вероятность того, что оно приземлится на вершину попытки xterm ввести данные в ваш терминал в ответ на ваш запрос. С точки зрения вашей оболочки, ответ xterm выглядит как вы, печатая.
Алекс Норт-Киз
1
Хм, терминал gnome в Ubuntu 12.04 утверждает, что он совместим с xterm, но ничего не печатает обратно. Это почему?
Ник Рейман
1
Теперь это чистый терминал вуду. Отличный ответ.
Qix - МОНИКА БЫЛА ПОВРЕЖДЕНА
0

вид

поместите настройки в файл ~ / .Xdefaults:

xterm*foreground: blue
xterm*background: white

в вашей оболочке вы просто grep значения:

awk '/xterm\*foreground:(.*)/ { print $2 }' < .Xdefaults

в противном случае довольно сложно получить некоторые внутренние значения xterm.

Акира
источник
Я даже не использую X :) Я использую rxvt от Cygwin, который работает без X-сервера. Кроме того, я хотел бы иметь возможность использовать разные цвета на разных хостах и ​​для разных задач, что требует, чтобы я запросил у терминала настройки.
Ужасная переменная
ну, вы не указали свою ОС :)
akira
прости за это. Причина, по которой я не указал, заключается в том, что я ожидал, что решение будет основано на выводе некоторых магических строк и получении некоторой информации о stdout.
Унылая переменная
хорошо, то, что вы «echo», обычно остается внутри оболочки (bash, zsh), оно не переходит к xterm (за исключением последнего шага, когда дело доходит до отображения вывода команд).
Акира
-1 awk - неподходящий инструмент для работы.
g33kz0r
-1

На самом деле я думаю, что вы хотите этого:

% xrdb -query

Это будет список настроек для вас. Смотрите также:

http://docstore.mik.ua/orelly/unix3/upt/ch06_08.htm

Чтобы изменить среду выполнения, используйте:

% echo "some*setting: somevalue" | xrdb -merge
g33kz0r
источник
-queryперечисляет все ресурсы. указание ресурса не работает на моем Ubuntu.
Акира
эхо "что угодно" | xrdb -merge
g33kz0r
перечитайте вопрос: OP хочет установить цвета BASH PROMPT в соответствии с настройками xterm. ОП не хочет менять внешние источники.
Акира
Смотрите его комментарий к вашему ответу. Он хочет «запросить терминал [sic]». Таким образом, он хочет xrdb -query
g33kz0r
если вы хотите быть таким конкретным: он хочет запросить rxvt без запущенного xserver на окнах (что возможно) и xrdb -queryпросто выдаст вам список всех ресурсов ... которые вы должны снова выполнить с помощью awk / grep, чтобы перейти на передний план. и это то, что я уже признал. xrdb -mergeздесь совершенно оффтопно, потому что OP не хочет модифицировать внешние ресурсы, кроме появления bashprompt.
Акира