Програматичний доступ до поточного кольору тла xterm?


12

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

Наприклад, синій підказки, якщо фон світлий, а бежевий - якщо темний.

Чи є спосіб дізнатися поточні налаштування в сценарії?

Відповіді:


20

Електронний лист від Томаса Дікі (керівника 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" s кольорів замість усіх "0" s). Використання або / bin / echo або bash's вбудованого ехо добре працює. Приклад, який я спробував, - це скопіювати / вставити безпосередньо з публікації вище. Моє середовище - Ubuntu 11.10 (похідна Linux / Debian). У мене немає іншої програми, зручної для тестування.
Алекс Норт-Кіс

Залежно від того, як налаштовано ваш запит, є ймовірність, що це посадка поверх спроби xterm ввести вхід у ваш термінал у відповідь на ваш запит. З точки зору вашої оболонки, відповідь xterm просто схожа на вас, набравши текст.
Алекс Норт-Кіс

1
Гм, термінал gnome в Ubuntu 12.04 вважає сумісність xterm, але нічого не друкує назад. Чому так?
Нік Рейман

1
Тепер це чистий термінальний вуду. Відмінна відповідь.
Qix

0

типу

помістіть налаштування у файл ~ / .Xdefaults:

xterm*foreground: blue
xterm*background: white

у своїй оболонці ви просто перебираєте значення:

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

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


Я навіть не використовую X :) Я використовую rxvt від cygwin, який працює без X-сервера. Крім того, я хотів би мати можливість використовувати різні кольори на різних хостах і для різних завдань, для чого потрібно запитати термінал щодо налаштувань.
Жалюгідна змінна

ну, ти не вказав свою ОС :)
akira

Вибач за те. Причина, яку я не вказав, полягає в тому, що я очікував, що рішення базуватиметься на повторенні деяких магічних рядків і поверне трохи інформації про stdout.
Жалюгідна змінна

ну, те, що ви "ехо" зазвичай залишається всередині оболонки (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

-queryперелічує всі ресурси. вказівка ​​ресурсу не працює на моєму ubuntu.
акіра

відлуння "що завгодно" | xrdb -merge
g33kz0r

перечитайте питання: OP хоче встановити кольори BASH PROMPT відповідно до налаштувань xterm. ОП не хоче змінювати джерела xres.
акіра

Дивіться його коментар до вашої відповіді. Він хоче "запитати термінал [sic]". Таким чином, він хоче
xrdb

якщо ви хочете бути такою конкретною: він хоче запитувати rxvt без випуску запущеного xserver у Windows (що можливо) і xrdb -queryпросто надає вам список усіх ресурсів .. які вам доведеться знову пробудити / грепнути, щоб дістатись до переднього плану. і ось що я вже визнав. xrdb -mergeтут повністю офтопік coz OP не хоче змінювати xresources, а зовнішній вигляд bashprompt.
акіра
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.