2010-08-27 9 views
87

Zacząłem pisać terminalowy edytor tekstu, podobnie jak pierwsze edytory tekstu dla systemu UNIX, takie jak vi. Moim jedynym celem jest dobrze się bawić, ale chcę mieć możliwość wyświetlania tekstu w kolorze, więc mogę mieć podświetlanie składni do edycji kodu źródłowego.Tekst koloru w aplikacjach terminalowych w UNIX

Jak mogę to osiągnąć? Czy jest w tym jakiś specjalny API POSIX, czy też muszę używać ncurses? (Wolę nie)

Jakaś radę? Może jakieś podręczniki na API UNIX?

Odpowiedz

139

Jest to mały program w C, który ilustruje, jak można użyć kodów kolorów:

#include <stdio.h> 

#define KNRM "\x1B[0m" 
#define KRED "\x1B[31m" 
#define KGRN "\x1B[32m" 
#define KYEL "\x1B[33m" 
#define KBLU "\x1B[34m" 
#define KMAG "\x1B[35m" 
#define KCYN "\x1B[36m" 
#define KWHT "\x1B[37m" 

int main() 
{ 
    printf("%sred\n", KRED); 
    printf("%sgreen\n", KGRN); 
    printf("%syellow\n", KYEL); 
    printf("%sblue\n", KBLU); 
    printf("%smagenta\n", KMAG); 
    printf("%scyan\n", KCYN); 
    printf("%swhite\n", KWHT); 
    printf("%snormal\n", KNRM); 

    return 0; 
} 
+77

'printf (magenta kmag "\ n");' jest znacznie czystsze i szybsze niż przy użyciu '% s'. –

+10

Powoduje ustawienie domyślnego koloru na zawsze po tym nowym kolorze tekstu. Aby przywrócić pierwotną wartość, należy użyć KNRM. – Schroeder

+0

Czy możliwe jest użycie określonego koloru (być może z wartościami RGB, np. '880000' dla ciemnoczerwonego itp.), Czy też utknęliśmy w 8 kolorach w powyższym przykładzie? – anthropomorphic

14

Użyj sekwencji sekwencji ANSI. This article zawiera szczegółowe informacje na ich temat. Można ich również używać z printf.

67

Oto kolejny sposób, aby to zrobić. Niektórzy wolą, ponieważ kod jest nieco czystszy (nie ma koloru %s i RESET, aby zakończyć kolorowanie).

#include <stdio.h> 

#define RED "\x1B[31m" 
#define GRN "\x1B[32m" 
#define YEL "\x1B[33m" 
#define BLU "\x1B[34m" 
#define MAG "\x1B[35m" 
#define CYN "\x1B[36m" 
#define WHT "\x1B[37m" 
#define RESET "\x1B[0m" 

int main() 
{ 
    printf(RED "red\n" RESET); 
    printf(GRN "green\n" RESET); 
    printf(YEL "yellow\n" RESET); 
    printf(BLU "blue\n" RESET); 
    printf(MAG "magenta\n" RESET); 
    printf(CYN "cyan\n" RESET); 
    printf(WHT "white\n" RESET); 

    return 0; 
} 

W ten sposób łatwo jest zrobić coś takiego:

printf("This is " RED "red" RESET " and this is " BLU "blue" RESET "\n"); 
+0

KNRM jest taki sam z RESET, prawda? –

+0

To właściwie dobre pytanie. Sądzę, że masz rację, ale nie potrafię wyjaśnić dlaczego. Mam na myśli, czy to ten sam dokładnie ten sam kod w innym formacie lub inne kody, które mają identyczne zachowanie? –

+0

Tak, zgodnie z twoim przykładem, różnią się one nieco formatem (\ x1B i \ 033), ale ich zachowanie jest takie samo. –