Подтвердить что ты не робот

Прочитать текущий цвет текста в xterm

Я пишу различные утилиты, и мне очень нравится раскрашенный текст. Ничего необычного, просто используя escape-последовательности. Я создал простой класс с функцией pprint (msg, color). У меня это работает довольно легко после нахождения кодов здесь.

Проблема, с которой я столкнулась, заключается в том, что после печати вы можете отключить цвет. Например, скажем, пользователь запускает мою программу, которая печатает почти все в цвете терминала по умолчанию, но есть ошибка, и я хочу напечатать ошибку красным цветом. Я префиксное сообщение с сообщением '\ 033 [0; 32m', и сообщение красного цвета. К сожалению, весь текст остается красным до тех пор, пока я его не изменю. Это вообще хорошо, когда моя программа запущена, потому что я знаю, какой цвет должен быть. Тем не менее, цвет остается после завершения моей программы. В принципе, я хочу прочитать текущий цвет, когда начнется моя программа, и восстановить его, когда закончите. То же самое, что скрипты восстанавливают pwd при выходе.

Как я могу прочитать текущую escape-последовательность?

Система: Red Hat 5.x Bash Python 2.3

Спасибо за помощь.

4b9b3361

Ответ 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 году, но реализация неполна (она позволяет только устанавливать цвет, а не получать цвет).