开发者

ANSI colors in C and ncurses

I know I can do the attron and attroff with the color I choose to, however, I would like to know if it's possible to do it with the ANSI colour escape codes within 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;
}

Linking with -lncurses

a regular printf("\033[22;31mHello, World!\n"); in a non-ncurses program works.


I think you're probably straying into dangerous territory there. Curses will almost certainly track character positions based on output characters and, since it provides its own colour handling, it probably won't detect ANSI escape sequences as well.

If you're after a possible way to allow the ANSI escape sequences in your strings, then one way (kludge though it is) would be to intercept the string and modify it. Have a helper function like myPrintW() which takes a string and breaks it down, something like (pseudo-code):

def myPrintW(s as copy):
    while s not empty:
        p = position of first ansi-sequence in s
        if p == NULL exit while
        printw first p characters of s
        remove the first p characters from s

        decode ansi-sequence at start of s
        issue relevant attron/off for that ansi-sequence
        remove ansi-sequence from start of s

    endwhile
    output s though it may be empty
enddef

This would basically break down the string into normal character sequences and ansi-sequences and you'd process each separately.

It would require a lookup table (or smarts if you need to handle ANSI sequences with arbitrary parameters) in order to translate the sequences into the desired attron/off calls.


Yes. It all depends on what kind of software or firmware is listening to the program's output. For V3.3 MSDOS, no, it won't work unless the device driver ansi.sys is loaded.

Modern terminal windows tend to have ANSI x3.64 semantics, so those escape sequences will often work. But don't expect too much: extra wide and extra high characters are notoriously poorly supported.


It won't be too safe integrating ANSI on ncurses. You want to use attron/off calls and perhaps split the string into %s and %d. For > 2 conversions, you need to implement your own printw


2008 mailing list thread discussing this: https://lists.gnu.org/archive/html/bug-ncurses/2008-11/msg00026.html

The possibilities raised were to:

  • create a parser for ANSI escape codes (WONTFIX in source). Mutt and Screen implement this: https://lists.gnu.org/archive/html/bug-ncurses/2008-11/msg00028.html

  • create a terminfo entry: https://lists.gnu.org/archive/html/bug-ncurses/2008-11/msg00029.html

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜