Kleur tekst in terminaltoepassingen in UNIX

Ik ben begonnen met het schrijven van een terminalteksteditor, zoiets als de eerste teksteditors voor UNIX, zoals vi. Mijn enige doel is om plezier te hebben, maar ik wil tekst in kleur kunnen weergeven, zodat ik syntaxisaccentuering kan hebben voor het bewerken van de broncode.

Hoe kan ik dit bereiken? Is hier een speciale POSIX API voor, of moet ik ncurses gebruiken? (Liever niet)

Enig advies? Misschien wat leerboeken over de UNIX API?


Antwoord 1, autoriteit 100%

Dit is een klein C-programma dat illustreert hoe u kleurcodes kunt gebruiken:

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

Antwoord 2, autoriteit 63%

Andere oplossing die ik eleganter vind

Hier is een andere manier om het te doen. Sommige mensen zullen hier de voorkeur aan geven omdat de code een beetje schoner is. Er zijn geen %sen een RESETkleur om de kleuring te beëindigen.

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

Dit programma geeft de volgende output:

voer hier de afbeeldingsbeschrijving in


Eenvoudig voorbeeld met meerdere kleuren

Op deze manier is het gemakkelijk om iets te doen als:

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

Deze regel produceert de volgende uitvoer:

uitvoer van de uitvoering


Antwoord 3, autoriteit 12%

U wilt waarschijnlijk ANSI-kleurcodes. De meeste *nix-terminals ondersteunen ze.


Antwoord 4, autoriteit 10%

Gebruik ANSI-escape-reeksen. Dit artikelgaat in detail over hen. Je kunt ze ook gebruiken met printf.

Other episodes