Управляющая последовательность 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 ответа на вопрос
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:
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)
и при необходимости (не уверен, зависит от системы) загрузка файла с помощью xrdb -merge. После этого запускается терминал с:
xterm -class MYXTerm
Теперь у вас должен быть терминал с набором частных цветов, которые не влияют на обычные. Теперь, если вам нужно запустить вашу программу в одном терминале, я действительно не знаю, как это сделать ...
Это жизнеспособный вариант только в системах, которые используют X11 или тот же набор инструментов. Он не будет работать на OS X или других серверах отображения Linux, таких как Wayland или Mir ...
Jonas Schubert Erlandsson 10 лет назад
0