Допустим, что я хочу написать программу-фильтр с интерфейсом на 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. Как выкрутиться из этой ситуации?
управляющие последовательности терминала и color_pair в ncurses (как проще получить соответствие?)
Модератор: Модераторы разделов
-
- Сообщения: 390
- ОС: gentoo
-
- Администратор
- Сообщения: 5413
- ОС: Gentoo
Re: управляющие последовательности терминала и color_pair в ncurses
1) В идеальной ситуации - да. Но не забывайте, что вывод ls может содержать не только цвета, но и атрибуты (жирный, инверсный и многие другие), а также то, что пользователь может через переменную LS_COLORS назначить свои esc-последовательности, которые вы уже не распарсите. В принципе, можно просто написать в мане, чтобы пользователь не становился ССЗБ и не назначал необычных последовательностей в LS_COLORS. Нехорошее решение, но единственная альтернатива - отказ от ncurses и ручная работа с терминалом.
2) А вот это как раз не проблема. Просто выберите для своего приложения фиксированный фон и заменяйте фон "-1" на ваш фиксированный фон, а цвет текста "-1" - на какой-нибудь цвет, который на этом фоне хорошо виден.
2) А вот это как раз не проблема. Просто выберите для своего приложения фиксированный фон и заменяйте фон "-1" на ваш фиксированный фон, а цвет текста "-1" - на какой-нибудь цвет, который на этом фоне хорошо виден.
Спасибо сказали:
-
- Сообщения: 390
- ОС: gentoo
Re: управляющие последовательности терминала и color_pair в ncurses
Спасибо, а то не хотелось изобретать велосипед, а на CPAN похожего не нашел.
/dev/random писал(а): ↑27.06.2011 07:452) А вот это как раз не проблема. Просто выберите для своего приложения фиксированный фон и заменяйте фон "-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,…) вернет все равно белый на черном. Но, видимо, ничего не поделаешь.