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

Мясо

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

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

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

Зачем?

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

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

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

бонус

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

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

3 ответа

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

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

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

xtermcontrol --get-color3

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

Наиболее близким к этому стандартному методу, который я могу придумать, было бы положиться на xrdb. Вы могли бы использовать xrdb -query и получить значения цвета, используемые текущим сеансом X Например, мой предоставляет следующее:

* 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 * передний план:    #D7D0C7
...

К сожалению, из-за того, как работает xrdb, я не знаю ни одного способа установить настройки только для под-оболочки, так как весь смысл xrdb состоит в том, чтобы координировать настройки для текущего x-сеанса. Однако вы можете "взломать" его, экспортировав настройки через xrdb -query и затем перезагрузите их, когда вы закончите.

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

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

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

xterm -class MYXTerm

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

Другие вопросы по тегам