2010-08-27 4 views
87

J'ai commencé à écrire un éditeur de texte de terminal, quelque chose comme les premiers éditeurs de texte pour UNIX, tels que vi. Mon seul but est de passer un bon moment, mais je veux être en mesure d'afficher du texte en couleur, donc je peux mettre en évidence la syntaxe pour éditer le code source.Texte couleur dans les applications de terminal sous UNIX

Comment puis-je y parvenir? Existe-t-il une API POSIX spéciale ou dois-je utiliser ncurses? (Je préfère ne pas)

Un conseil? Peut-être quelques manuels sur l'API UNIX?

Répondre

139

Ceci est un petit programme C qui illustre comment vous pouvez utiliser des codes couleur:

#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 (KMAG "magenta \ n");' est beaucoup plus propre et plus rapide que d'utiliser '% s'. –

+10

Ceci définit la couleur par défaut pour toujours après cette nouvelle couleur de texte. Pour le remettre à l'original employer KNRM. – Schroeder

+0

Est-il possible d'utiliser une couleur spécifique (peut-être avec des valeurs RGB comme '880000' pour le rouge foncé, etc.), ou sommes-nous bloqués avec les 8 couleurs dans l'exemple ci-dessus? – anthropomorphic

14

Utiliser des séquences d'échappement ANSI. This article va dans certains détails à leur sujet. Vous pouvez également les utiliser avec printf.

67

Voici une autre façon de le faire. Certaines personnes préféreront cela car le code est un peu plus propre (il n'y a pas de %s et une couleur RESET pour terminer la coloration).

#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; 
} 

De cette façon, il est facile de faire quelque chose comme:

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

KNRM est la même chose avec RESET, n'est-ce pas? –

+0

C'est en fait une bonne question. Je suppose que tu as raison, mais je ne peux pas expliquer pourquoi. Je veux dire, est-ce exactement le même code dans un format différent ou des codes différents qui ont un comportement identique? –

+0

Oui, selon votre exemple, ils sont différents peu au format (\ x1B et \ 033) mais leur comportement est le même. –

Questions connexes