Почему escape-коды ANSI не отображаются должным образом?

Я реализую консольное приложение Python, которое использует escape-коды ANSI для раскрашивания различных вещей. Я разрабатываю на Pop OS (производная от Ubuntu), и раскрашивание работает так, как задумано.

Я только что попробовал приложение на машине Centos, и хотя цвета отображаются правильно, есть дополнительный текст (крошечные квадратики с цифрами, расположенные вертикально), окружающий раскрашенный текст, который, по-видимому, соответствует escape-кодам.

Все escape-коды указаны в этом фрагменте Python:

style = ('\033[1m\033[3m' if bold and italic else
         '\033[1m' if bold else
         '\033[3m' if italic else
         '\033[0m')
return f'\001{style}\002\001\033[38;5;{color.code}m\002{s}\001\033[0m\002'

(Я работаю над проектом https://github.com/geophile/marcel, и приведенный выше код взят из marcel.util.colorize().)

Что действительно странно, так это то, что в некоторых случаях лишних символов нет, а в других они есть. Кроме того, если я подключаюсь по ssh со своей машины с поп-ОС к машине с центосом, текст во всех случаях раскрашивается правильно.

Чем объясняется эта разница в поведении — чем-то в .bashrc? Что-то о конфигурации X?


person Jack Orenstein    schedule 11.11.2020    source источник


Ответы (1)


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

person Thomas Dickey    schedule 15.11.2020
comment
Я перечитал информацию, которую нашел, работая над раскраской, и обнаружил, что \001 и \002 действительно не являются управляющими кодами ANSI. Они интерпретируются readline. Я обнаружил, что вычисления длины строки с помощью readline были неправильными без этих кодов. Так что теперь мой код раскрашивания включает \001 и \002 при подготовке подсказок для использования readline и исключает их в противном случае. - person Jack Orenstein; 17.11.2020