Оформление текста вложением с использованием escape-последовательностей VT100
Есть ли способ вложить escape-последовательности VT100? Например, если я хочу слово, выделенное жирным шрифтом, внутри красного текста, как показано ниже:
Есть ли простой способ сделать это? Если я сделаю следующее, первый \e[m
предназначен для закрытия жирным шрифтом будет также закрыть красный цвет.
"\e[31mfoo \e[01mbar\e[m baz\e[m"
2 ответа
Нет - они не "гнездятся". Как правило, режимы видео можно устанавливать или сбрасывать. Некоторые сбросы влияют на несколько режимов, например, \e[m
который сбрасывает жирный шрифт, подчеркивание, реверс
В DEC VT100 реализовано подмножество стандарта ANSI, а также предусмотрены расширения. Соответствующий стандарт был признан устаревшим стандартом ISO-6429, который легко доступен как ECMA-48.
Внимательное прочтение стандарта может продемонстрировать, что некоторые из него неоднозначны, т. Е. Могут рассматриваться как намеки на различные типы поведения. Например, нет перечисления возможных атрибутов видео в разделе SGR (установка графического представления) и того, как они могут быть взаимосвязаны. Из-за этой неоднозначности существуют терминалы, использующие "escape-последовательности VT100", которые имеют заметно различающиеся цветовые характеристики (см., Например, FAQ по ncurses. Мой терминал показывает некоторые неокрашенные пробелы).
Поскольку стандарт не определяет все, мы полагаемся на общепринятую практику и соглашения, чтобы определить, что можно ожидать от эмулятора терминала, и где можно разработать новую функцию, расширяющую стандарт. Например, ECMA-48 не упоминает функцию прокрутки VT100, которая широко используется. Кроме того, это фактически не говорит, что SGR 0 сбрасывает цвет. Хотя существующие эмуляторы терминалов делают это, еще до того, как соглашение стало распространенным, было возможно иметь эмуляторы терминалов, которые использовали разные escape-последовательности для сброса цвета. (Функция динамических цветов в xterm является примером этого).
Как уже отмечалось, возможно предоставление расширений. ECMA-48 обрисовывает в общих чертах кодирование для частных последовательностей управления (зависящих от реализации). Кто-то может (никто не...) спроектировать терминал, который предоставляет тип предлагаемой функции. Если бы это не удовлетворяло предполагаемую потребность многих людей или было бы громоздким в использовании, это было бы проигнорировано. Поскольку этот тип escape-последовательности отличается от существующей практики, его не поддерживают в curses и подобных библиотеках. Это сделало бы использование громоздким.
Это не говорит о том, что невозможно обеспечить такую функцию. Например, xterm, начиная с патча № 251, предоставляет функцию (встроенную в экран GNU), которая обходит давнюю проблему получения заголовков окон (рассматриваемых как проблема безопасности), добавляя режим, в котором заголовки сохраняются в стеке. Экран GNU использует эту функцию там, где она существует, для автоматического восстановления исходного заголовка окна при выходе.
\e[m
сбрасывает все графические параметры воспроизведения, включая цвет. Чтобы очистить только полужирный вариант, вы можете использовать \e[22m
, хотя не все терминалы поддерживают эту последовательность.