Я знаю, что, если имеется цветной терминал, его цвет можно вывести с помощью escape-символов .
Но есть ли возможность узнать, каким цветом вывод отображается в данный момент? Или лучше, какого цвета будет текст, если я выведу его прямо сейчас?
Я прошу не нарушать какие-либо предыдущие настройки цвета при использовании этих escape-символов. Экранирующий символ «Цвет переднего плана по умолчанию» получает информацию из цветовой схемы, а не с цвета текста, прежде чем я изменил его.
echotc Co
илиechoti colors
, но просто не существует переменной, в которой хранится текущее определение цветового кода.Ответы:
В общем, получение текущих цветов невозможно. Обработка управляющей последовательности терминала происходит «внутри» терминала, где бы это ни происходило. С эмулятором терминала, таким как
xterm
или встроенный в ядро операционной системы, которое предоставляет виртуальные терминалы ядра, внутреннее состояние эмулятора, включая его представление о текущем «графическом представлении» (то есть цвет и атрибуты), находится на компьютере сам и теоретически доступен. Но для реального терминала эта информация находится в некотором месте ОЗУ на физически отдельной машине, подключенной через последовательный канал.Тем не менее, некоторые терминалы включают в себя механизм для считывания такой информации как часть их протокола терминала, который отправляется по этой последовательной линии связи. Они предоставляют управляющие последовательности, которые программа может отправлять на терминал, что заставляет ее отправлять обратно информацию о своем внутреннем состоянии, как ввод с терминала.
mikeserv
показал последовательности управления, на которыеxterm
отвечает эмулятор терминала. Но это конкретно дляxterm
. Например, встроенные эмуляторы терминала в ядре Linux и различных ядрах BSD представляют собой разные типы терминалов и вообще не реализуют никаких таких управляющих последовательностей. То же самое касается целых семей реальных терминалов.Терминалы DEC VT525 реализуют механизм считывания, но имеют набор последовательностей управления, которые не имеют отношения к тем, которые используются
xterm
. Один отправляет последовательность DECRQSS (запрос выбора или настройки), чтобы запросить текущее графическое представление, и терминал отвечает отправкой DECRPSS (выбор отчета или настройка). В частности:$
q
m
ST (DECRQSS с частью функции управления SGR в качестве настройки)0
$
r
0
;
3
3
;
4
4
m
ST (DECRPSS с параметрами и частью функции управления последовательности управления SGR, которая устанавливает текущие цвета переднего плана и фона)Конечно, внимательное изучение вашего вопроса показывает, что вы снова махаете бананом в шоколадной оболочке в этих европейских валютных системах. То, что вы на самом деле пытаетесь сделать, для которого вы выбрали решение, а затем спросили, как выполнить часть этого решения, - это сохранить предыдущее состояние, пока вы пишете какой-либо цветовой вывод. Для этого есть не только управляющая последовательность DEC VT, но и последовательность консольных терминалов SCO, которая распознается
xterm
различными встроенными в ядро эмуляторами терминалов, и запись termcap / terminfo, которая сообщает вам, что они представляют для вашего терминала.Записи termcap являются
sc
иrc
. Записи terminfo - этоsave_cursor
иrestore_cursor
. Имена несколько вводят в заблуждение относительно эффекта (хотя они действуют как предупреждение, что вы полагаетесь на что-то де-факто, а не де-юре ). Фактические последовательности управления DECSC, DECRC, SCOSC и SCORC также сохраняют и восстанавливают текущее графическое представление.Учитывая, что статья, на которую вы указали, посвящена генерации управляющих последовательностей из сценариев оболочки, команда, которую вы сейчас ищете, - это
tput
.дальнейшее чтение
источник
sc
иrc
, вы также можете посмотреть в альтернативный буфер, если ваш терминал поддерживает его. И да, это отличный ответ. Minix, может быть, также посмотрите на это: как использовать / dev / fb0 в качестве консоли из пользовательского пространства .nosh
Свита он рекомендует есть его собственное.DECRQSS
(с задержкой около 7 лет ...).В одном
xterm
вы можете получить текущие цветов RGB цветовых коды сообщенных посредством изменения побега изменения цвета на запрос. ИспользуйтеESC ] Ps m
- но добавьте?
знак вопроса. Из документов :"?"
задано а, а не имя или спецификация RGB, тоxterm
отвечает контрольной последовательностью той же формы, которую можно использовать для установки соответствующего динамического цвета. Поскольку в одной последовательности управления может быть задано более одной пары номера цвета и спецификации,xterm
можно сделать более одного ответа.У меня есть серьезные сомнения, если это будет работать в другом эмуляторе терминала, но
xterm
если вы запустите ...... команда
xterm
вернет во входной буфер вашего терминала последовательность, подобную следующей ...... для фона или для переднего плана:
источник
printf '\033]10;rgb:8f8f/8f8f/8f8f8f\007
, весь текст в терминале, который раньше был «нормальным», становился голубым. Впоследствии, бегprintf '\033]10;rgb:bfbfbf/bfbfbf/bfbfbf\007'
превращает весь светло-синий текст обратно в «нормальный». Как использовать это значение, чтобы изменить цвет текста только вперед?clear
сначала?printf '\033]10;?\007'
запрашивает xterm текущий цвет переднего плана терминала. Если ваш терминал был запущен с «нормальным» (например, 7 в качестве цвета переднего плана), но вы запускаетеtput setaf 3
перед запускомprintf
команды, приведеннаяprintf
выше команда все еще возвращает «нормальный» - и это правильно, потому что это текущий цвет переднего плана вашего терминала. То, на что я надеялся, это способ получить текущий цвет текущей позиции курсора, чтобы я мог сохранить его, чтобы «восстановить» его позже - согласно ОП.xterm
сопровождающий и активный участник здесь. (ссылка на его веб-сайт -xterm
справочные документы обширные - и в основном стандартная ссылка для любого другого программиста, желающего написать терминал)