116 votes

Texte en couleur dans les applications de terminal sous UNIX

J'ai commencé à écrire un éditeur de texte pour terminal, quelque chose comme les premiers éditeurs de texte pour UNIX, comme vi. Mon seul but est de m'amuser, mais je veux être capable d'afficher le texte en couleur, afin d'avoir une coloration syntaxique pour l'édition du code source.

Comment puis-je réaliser cela ? Existe-t-il une API POSIX spéciale pour cela, ou dois-je utiliser ncurses ? (Je ne préfère pas)

Des conseils ? Peut-être des manuels sur l'API UNIX ?

0 votes

Vous pouvez utiliser cette méthode simple à la place. Cela présente également certains avantages par rapport à la simple impression des couleurs.

187voto

karlphillip Points 46502

Il s'agit d'un petit programme en C qui illustre la façon dont vous pouvez utiliser les codes de 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;
}

105 votes

printf(KMAG "magenta\n"); est beaucoup plus propre et rapide que l'utilisation de %s .

14 votes

Cela définit la couleur par défaut pour toujours à cette nouvelle couleur de texte. Pour revenir à la couleur originale, utilisez KNRM.

0 votes

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 coincés avec les 8 couleurs de l'exemple ci-dessus ?

118voto

DGeTuX Points 430

Une solution différente que je trouve plus élégante

Voici une autre façon de procéder. Certaines personnes préféreront cette méthode car le code est un peu plus propre. Il n'y a pas de %s et un 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;
}

Ce programme donne le résultat suivant :

enter image description here


Exemple simple avec plusieurs couleurs

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");

Cette ligne produit la sortie suivante :

execution's output

0 votes

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

0 votes

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

0 votes

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

22voto

nmichaels Points 21955

Vous voulez probablement Codes de couleur ANSI . La plupart des terminaux *nix les supportent.

19voto

Vivin Paliath Points 40975

Utilisez les séquences d'échappement ANSI. Cet article donne quelques détails à leur sujet. Vous pouvez les utiliser avec printf également.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X