2010-12-07 73 views
4

我知道我可以做attronattroff与我选择,但是,我想知道,如果有可能的ncurses内与ANSI颜色转义符来做到这一点的颜色:ANSI颜色C和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的程序工作链接。

回答

0

我想你可能会在那里陷入危险的境地。诅咒几乎肯定会跟踪输出字符的字符位置,并且由于它提供了自己的颜色处理,因此它可能也不会检测ANSI转义序列。

可能工作(你尝试过吗?)但它也可能完全填满窗口管理。


而且,由于你的评论指出,它不工作,那么我想答案是“不” :-)

如果你是一个可行的办法,让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 

这基本上是打破串入正常的字符序列和颜色变化序列和你” d分别处理。这将需要一个查找表,以便将序列转换为所需的attron/off调用。不漂亮,但有时候实用主义是最好的。

+0

是的,我没有尝试,但没有奏效。我想知道,什么是做上述的好方法(我更新了我的示例代码) – DaNiro1 2010-12-07 05:43:49

0

是的。这完全取决于哪种软件或固件正在监听程序的输出。对于V3.3 MSDOS,不,除非加载设备驱动程序ansi.sys,否则它将不起作用。

现代终端窗口往往有ANSI x3.64语义,所以这些转义序列通常会工作。但是不要期望太多:额外的广泛的和超高的字符被广泛地支持。

0

ncurses整合ANSI并不是太安全。您希望使用attron/off调用,并可能将字符串拆分为%s%d。对于> 2间的转换,你需要实现自己的printw