3

Мясо

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

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

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

Зачем?

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

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

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

бонус

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

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

3 ответа3

2

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

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

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

xtermcontrol --get-color3

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

2

Самым близким к стандартному методу для этого, который я могу придумать, было бы положиться на 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
*foreground:    #D7D0C7
...

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

0

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

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

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

xterm -class MYXTerm

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .