управляющие последовательности терминала и color_pair в ncurses (как проще получить соответствие?)

Модератор: Модераторы разделов

liaonau
Сообщения: 390
ОС: gentoo

управляющие последовательности терминала и color_pair в ncurses

Сообщение liaonau »

Допустим, что я хочу написать программу-фильтр с интерфейсом на curses, которая читает stdin и пишет в stdout. Что-то похожее на dialog. Программа должна сохранять цвета, например, команды ls --color=always.
У меня возникли некоторые вопросы.

1) Я могу применяя регулярные выражения вытащить цвет из строки (например, \e[34;45m) и вручную записать 2 хеша соответствий для цветов текста и фона, (к примеру, 31 => COLOR_RED) и аналогичный хеш для атрибутов. Это нормальная идея, или же есть какие-то более универсальные и простые решения? Хочется чего-нибудь наподобие tput bold|cat -v, только наоборот.

2) Если эта идея нормальна, то возникает следующая проблема. Curses позволяет применить только пару цветов, поэтому «\e[34m» превращается в init_pair(«номер», COLOR_BLUE, -1). Что из себя представляет цвет по умолчанию — «-1» ни мне ни curses в случае произвольного терминала не известно. Поэтому в общем случае есть (8 базовых + 1 по умолчанию) * (8 + 1) пар (или на 8 меньше, если не инициализировать белый на белом и т.д.), что больше чем 64 пары, которые позволяет инициализировать виртуальный терминал linux. Как выкрутиться из этой ситуации?
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5413
ОС: Gentoo

Re: управляющие последовательности терминала и color_pair в ncurses

Сообщение /dev/random »

1) В идеальной ситуации - да. Но не забывайте, что вывод ls может содержать не только цвета, но и атрибуты (жирный, инверсный и многие другие), а также то, что пользователь может через переменную LS_COLORS назначить свои esc-последовательности, которые вы уже не распарсите. В принципе, можно просто написать в мане, чтобы пользователь не становился ССЗБ и не назначал необычных последовательностей в LS_COLORS. Нехорошее решение, но единственная альтернатива - отказ от ncurses и ручная работа с терминалом.

2) А вот это как раз не проблема. Просто выберите для своего приложения фиксированный фон и заменяйте фон "-1" на ваш фиксированный фон, а цвет текста "-1" - на какой-нибудь цвет, который на этом фоне хорошо виден.
Спасибо сказали:
liaonau
Сообщения: 390
ОС: gentoo

Re: управляющие последовательности терминала и color_pair в ncurses

Сообщение liaonau »

/dev/random писал(а):
27.06.2011 07:45
1) В идеальной ситуации - да.

Спасибо, а то не хотелось изобретать велосипед, а на CPAN похожего не нашел.

/dev/random писал(а):
27.06.2011 07:45
2) А вот это как раз не проблема. Просто выберите для своего приложения фиксированный фон и заменяйте фон "-1" на ваш фиксированный фон, а цвет текста "-1" - на какой-нибудь цвет, который на этом фоне хорошо виден.

Пока поступил так.

Код: Выделить всё

my ($dfg, $dbg);
my $max_pairs = `tput pairs` || 64;
if ( ($max_pairs > 73) && (use_default_colors() == 0) ) {
    $dfg = -1; $dbg = -1;
}
else { pair_content(0,$dfg,$dbg); }

Единственное, что если цвета по умолчанию виртуального терминала были переопределены с помощью, например, echo -n "\033[30;47m\033[8]", то pair_content(0,…) вернет все равно белый на черном. Но, видимо, ничего не поделаешь.
Спасибо сказали: