Управляющая последовательность Xterm для получения значения RGB для цвета ANSI

1273
Jonas Schubert Erlandsson

Мясо

В (некоторых) терминалах вы можете использовать последовательность, подобную этой;

printf "\e]4;3;rgb:cc/78/33\e\\" 

установить третий цвет в цветовой палитре ANSI равным значениям RGB, представленным # CC7833. Вы можете сделать наоборот? Могу ли я получить текущее значение RGB (в любой форме) третьего (ну, действительно, любого) цвета?

Зачем?

Причина, по которой вы захотите сделать это, в моем случае, состоит в том, чтобы иметь возможность сохранить всю таблицу цветов перед тем, как испортить ее (специально). Я хочу иметь возможность перечислять код в терминале, используя точную цветовую тему RGB, назовите меня анальным. Чтобы сделать это, я должен переопределить определения цвета в таблице цветов терминала, как указано выше.

Для меня проблема сейчас решена. Но так как я хочу добавить эту функциональность в существующий проект с открытым исходным кодом (pry), используемый многими людьми, мне нужно иметь возможность сохранить текущее состояние цветовой палитры, прежде чем устанавливать цвета темы для сеанса программ, а затем переключать их назад после.

Я знаю, что некоторые терминалы имеют это в настройках, а некоторые системы имеют это в конфигурационных файлах. Но мне нужно что-то общее и работающее в разных системах. В идеале все системы, которые поддерживают настройку их указанным выше способом :)

бонус

Прямо сейчас изменение цвета влияет на всю систему, на все сеансы терминала, даже после закрытия и перезапуска терминала (это использует iTerm2 на OS X Mountain Lion).

Если эффект можно сделать локальным, скажем, для вспомогательной оболочки, проблема исчезнет, ​​поскольку изменения завершатся с вложенной оболочкой после завершения процесса. Еще лучше, поскольку это защитит от случаев, когда сессия потерпела крах ...

3

3 ответа на вопрос

2
tgood

The closest to a standard method for this that I can think of would be to rely on xrdb. You could use xrdb -query and get the color values used by the current X session. For example, mine provides the following:

*background: #151515 *color0: #101010 *color1: #E84F4F *color10: #A0CF5D *color11: #F39D21 *color12: #4E9FB1 *color13: #8542FF *color14: #42717B *color15: #dddddd *color2: #B8D68C *color3: #E1AA5D *color4: #7DC1CF *color5: #9B64FB *color6: #6D878D *color7: #dddddd *color8: #404040 *color9: #D23D3D *foreground: #D7D0C7 ... 

Unfortunately, due to the way xrdb works, I'm not aware of any way to only set settings for a sub-shell, as the entire point of xrdb is to coordinate settings for the current x-session. However, you could "hack" around it by exporting the settings via xrdb -query and then reloading them when you are done.

Это жизнеспособный вариант только в системах, которые используют X11 или тот же набор инструментов. Он не будет работать на OS X или других серверах отображения Linux, таких как Wayland или Mir ... Jonas Schubert Erlandsson 10 лет назад 0
О да. Извините - я предположил, что OS X по какой-то причине использовал X. tgood 10 лет назад 0
2
egmont

Вы можете запросить цвет с

printf "\e]4;3;?\e\\" 

который помещает ответ в буфер клавиатуры, как если бы вы набрали его в терминале (что трудно обработать в сценариях оболочки). Или вы можете использовать

xtermcontrol --get-color3 

который удобный интерфейс, используя эту escape-последовательность.

0
Rmano

Классическим способом, который я использовал, было определение набора свойств xrdb для нового класса, например: (в Linux вы должны поместить его в $ HOME / .Xdefault- hostname, YMMV)

MYXTerm*foreground: red; MYXTerm*color11: navyblue; 

и при необходимости (не уверен, зависит от системы) загрузка файла с помощью xrdb -merge. После этого запускается терминал с:

xterm -class MYXTerm 

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

Это жизнеспособный вариант только в системах, которые используют X11 или тот же набор инструментов. Он не будет работать на OS X или других серверах отображения Linux, таких как Wayland или Mir ... Jonas Schubert Erlandsson 10 лет назад 0