Цвета ANSI в C и ncurses

Я знаю, что могу сделать attron и attroff с цветом, который я выберу, однако я хотел бы знать, возможно ли это сделать с кодами перехода цвета ANSI в ncurses:

#include <stdio.h>
#include <ncurses.h>

int main()
{
   initscr();
   char *s2 = NULL;
   const char *s1 = "World";
   int n = 10; 

   // What would be a good way to colour %d?
   // seems it is not safe to us the ANSI color escape in here...
   s2 = malloc (snprintf (NULL, 0, "Hello %s \033[22;31m%d", s1, n) + 2); 
   sprintf (s2, "Hello %s \033[22;31m%d", s1, n); 
   printw("%s", s2);
   refresh();
   getch();
   endwin();

   return 0;
}

Связь с -lncurses

обычный printf("\033[22;31mHello, World!\n"); в программе, отличной от ncurses, работает.


person DaNiro1    schedule 07.12.2010    source источник


Ответы (4)


Я думаю, вы, вероятно, забрели на опасную территорию. Curses почти наверняка будет отслеживать позиции символов на основе выходных символов и, поскольку он обеспечивает собственную обработку цвета, он, вероятно, также не будет обнаруживать управляющие последовательности ANSI.

Это может работать (вы пробовали?), но также может привести к полному зависанию управления окнами.


И, поскольку вы заявили в комментарии, что это не сработало, я думаю, ответ будет «нет» :-)

Если вам нужен возможный способ разрешить escape-последовательности ANSI в ваших строках, то одним из способов (хотя это и так) будет перехват строки и ее изменение. Имейте вспомогательную функцию, такую ​​как myPrintW(), которая берет строку и разбивает ее, что-то вроде (псевдокод):

def myPrintW(s):
    while s not end of string:
        s2 = position of color-change-sequence in s
        if s2 == NULL exit while
        printw characters from s (inclusive) to s2 (exclusive)
        decode color-change-sequence at s2 and issue relevant attron/off
        s = s2 + length of color-change-sequence
    endwhile
enddef

Это в основном разбило бы строку на обычные последовательности символов и последовательности изменения цвета, и вы бы обрабатывали каждую отдельно. Потребуется таблица поиска, чтобы преобразовать последовательности в желаемые attron/off вызовы. Некрасиво, но иногда прагматизм лучше.

person paxdiablo    schedule 07.12.2010
comment
Да, я пытался, но это не сработало. Мне интересно, что было бы хорошим способом сделать вышеизложенное (я обновил свой пример кода) - person DaNiro1; 07.12.2010
comment
Мне нравится подход, однако мне интересно, нужна ли таблица поиска? - person DaNiro1; 07.12.2010
comment
Если бы вы могли найти формулу для преобразования последовательности ANSI в пару цветов, это было бы лучше. Но, поскольку я не знаю точно, что COLOR_PAIR(a,b) будет делать в общей реализации, вероятно, безопаснее использовать поиск. - person paxdiablo; 07.12.2010

да. Все зависит от того, какое ПО или прошивка прослушивает вывод программы. Для версии 3.3 MSDOS нет, она не будет работать, если не загружен драйвер устройства ansi.sys.

Современные окна терминала, как правило, имеют семантику ANSI x3.64, поэтому эти управляющие последовательности часто работают. . Но не ожидайте слишком многого: общеизвестно, что сверхширокие и сверхвысокие символы плохо поддерживаются.

person wallyk    schedule 07.12.2010

Интеграция ANSI на ncurses будет небезопасной. Вы хотите использовать вызовы attron/off и, возможно, разделить строку на %s и %d. Для > 2 конверсий вам необходимо реализовать собственные printw

person Yuks    schedule 07.12.2010

Ветка списка рассылки 2008 года, в которой обсуждается это: https://lists.gnu.org/archive/html/bug-ncurses/2008-11/msg00026.html

Открывшиеся возможности заключались в следующем:

person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 19.10.2015