ANSI цвета в C и ncurses - PullRequest
       37

ANSI цвета в C и ncurses

5 голосов
/ 07 декабря 2010

Я знаю, что могу сделать 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"); в не-курсивной программе работает.

Ответы [ 4 ]

1 голос
/ 07 декабря 2010

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

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


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

Если вам нужен возможный способ разрешить escape-последовательности ANSI в ваших строках, то один из способов (хотя это и есть kludge) - перехватить строку и изменить ее. Имейте вспомогательную функцию, такую ​​как 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 потребуется таблица поиска. Не красиво, но иногда прагматизм лучше.

0 голосов

2008 рассылка обсуждает это: https://lists.gnu.org/archive/html/bug-ncurses/2008-11/msg00026.html

Возможности были:

0 голосов
/ 07 декабря 2010

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

0 голосов
/ 07 декабря 2010

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

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

...