Прочитать текущий цвет текста в xterm
Я пишу различные утилиты, и мне очень нравится раскрашенный текст. Ничего необычного, просто используя escape-последовательности. Я создал простой класс с функцией pprint (msg, color). У меня это работает довольно легко после нахождения кодов здесь.
Проблема, с которой я столкнулась, заключается в том, что после печати вы можете отключить цвет. Например, скажем, пользователь запускает мою программу, которая печатает почти все в цвете терминала по умолчанию, но есть ошибка, и я хочу напечатать ошибку красным цветом. Я префиксное сообщение с сообщением '\ 033 [0; 32m', и сообщение красного цвета. К сожалению, весь текст остается красным до тех пор, пока я его не изменю. Это вообще хорошо, когда моя программа запущена, потому что я знаю, какой цвет должен быть. Тем не менее, цвет остается после завершения моей программы. В принципе, я хочу прочитать текущий цвет, когда начнется моя программа, и восстановить его, когда закончите. То же самое, что скрипты восстанавливают pwd при выходе.
Как я могу прочитать текущую escape-последовательность?
Система:
Red Hat 5.x
Bash
Python 2.3
Спасибо за помощь.
Ответы
Ответ 1
Я не считаю, что это возможно, и вряд ли будет переносимым, если бы это было так. Лучшее, что вы можете сделать, это отправить sgr0
, который сбрасывает все атрибуты по умолчанию (не ранее). В xterms sgr0
есть Esc[m
. Если вы хотите reset цвета и не влиять на другие атрибуты, отправьте op
, который на xterms равен Esc[39;49m
.
Эти коды не должны быть жестко запрограммированы. Вы должны использовать terminfo, termcap или [n] curses.
Ответ 2
Вместо использования обфускационных управляющих последовательностей вместо этого используйте средство tput
. Вот отрывок из моего ~/.bashrc
, который я использую для моего приглашения PS1:
BLACK=$(tput setaf 0)
RED=$(tput setaf 1)
GREEN=$(tput setaf 2)
YELLOW=$(tput setaf 3)
LIME_YELLOW=$(tput setaf 190)
POWDER_BLUE=$(tput setaf 153)
BLUE=$(tput setaf 4)
MAGENTA=$(tput setaf 5)
CYAN=$(tput setaf 6)
WHITE=$(tput setaf 7)
BRIGHT=$(tput bold)
NORMAL=$(tput sgr0)
BLINK=$(tput blink)
REVERSE=$(tput smso)
UNDERLINE=$(tput smul)
В reset информацию о цвете, в которой последующий текст находится в обычном цвете терминала, вы должны добавить ${NORMAL}
в конец так:
echo "${RED}this is red ${NORMAL}this is normal"
Ответ 3
RED = 31
GREEN = 32
ESCAPE = '%s[' % chr(27)
RESET = '%s0m' % ESCAPE
FORMAT = '1;%dm'
def colorize(text, color):
return ESCAPE + (FORMAT % (color, )) + text + RESET
Эта функция вернет строку, которая будет печатать раскрашенную, при этом терминал автоматически будет reset впоследствии.
Ответ 4
Собственно, это возможно. для
xterm и совместимые терминалы.
xtermcontrol использует, например, OSC 10
для получения цветов по умолчанию переднего плана/фона. Он был задокументирован в xterm с 2002 года.
Для других терминалов:
- В RHEL 5 программа "Терминал" является gnome-terminal 2.16.0; эта версия не распознает
OSC 10
(протестирована с эквивалентом CentOS 5).
- Вопрос был задан в 2010 году, ссылаясь на корпоративную версию Red Hat, которая, если вообще, медленнее обновлять, чем Debian.
- Перемещение вперед во времени, gnome-terminal 3.4.1.1 на Debian 7 (начало 2012 года) также не распознает последовательность управления.
- Наконец, в Debian 8 с 3.14.1 (конец 2014 года) признана функция.
- CentOS 7 gnome-terminal 3.14.3 распознает последовательность управления.
Интересно, когда он был добавлен, имейте в виду, что разработчики VTE не пишут документацию. Итак... изучение журнала git показывает
commit 1b8c6b1aac587b79476a60a5830385abc939430d
Author: Egmont Koblinger <[email protected]>
Date: Wed Jan 22 00:13:51 2014 +0100
emulation: Add support for OSC 1?1[017] (fg, bg, highlight colors)
https://bugzilla.gnome.org/show_bug.cgi?id=567444
С другой стороны, цвета по умолчанию не совпадают с текущими цветами. Пользователи смогли сделать это с помощью xterm с patch # 93 в 1999 году, используя управляющую последовательность DECRQSS
. То есть, вывод терминала в сырой режим и выполнение чего-то вроде
printf '\033P$m\033\\'
заставит его ответить строкой, заполненной параметрами SGR.
Если цвета были установлены с использованием SGR, эти коды были бы частью ответа, например.
\033P1$r0;33m\033\\
для обозначения цвета цветного изображения 3 (кодируется как 33
).
Вы можете остановиться там (потому что вы можете извлечь эти параметры и повторно использовать их, чтобы установить терминал в одно и то же состояние позже), но затем получение фактических цветов RGB возможно с помощью OSC 4
. Вы должны использовать номер цвета (из последовательности SGR) и отправить что-то вроде этого:
printf '\033]4;3;?\033\\'
Так что это, безусловно, возможно с xterm. В следующем обновлении для xterm будет demo/test- script для DECRQSS
.
Для других программ вам нужно больше времени:
-
Разработчик xtermcontrol не учитывает DECRQSS
(у него нет возможности устанавливать/получать коды SGR).
-
Разработчики VTE копируют функции xterm в ответ на отчеты об ошибках; источник VTE не упоминает DECRQSS
. В журнале git упоминается OSC 4
в 2009 году, но реализация неполна (она позволяет только устанавливать цвет, а не получать цвет).