2010-08-27 9 views
87

Ich begann, einen Terminal-Text-Editor zu schreiben, so etwas wie die ersten Texteditoren für UNIX, wie vi. Mein einziges Ziel ist es, eine gute Zeit zu haben, aber ich möchte in der Lage sein, Text in Farbe zu zeigen, so dass ich Syntaxhervorhebung für das Bearbeiten von Quellcode haben kann.Farbe Text in Terminal-Anwendungen in UNIX

Wie kann ich das erreichen? Gibt es dafür eine spezielle POSIX-API oder muss ich ncurses verwenden? (Ich würde lieber nicht)

Irgendwelche Tipps? Vielleicht einige Lehrbücher auf der UNIX API?

Antwort

139

Dies ist ein kleines C-Programm, das zeigt, wie Sie Farbcodes verwenden:

#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");' ist viel sauberer und schneller als '% s' verwenden. –

+10

Dies setzt die Standardfarbe für immer nach dieser neuen Textfarbe. Um es auf das Original zurückzusetzen, verwenden Sie KNRM. – Schroeder

+0

Ist es möglich, eine bestimmte Farbe zu verwenden (vielleicht mit RGB-Werten wie '880000' für dunkelrot, etc.) oder sind wir mit den 8 Farben im obigen Beispiel festgefahren? – anthropomorphic

14

Verwenden Sie ANSI-Escape-Sequenzen. This article geht etwas ins Detail über sie. Sie können sie auch mit printf verwenden.

67

Hier ist eine andere Art und Weise, es zu tun. Einige Leute werden dies bevorzugen, da der Code ein wenig sauberer ist (es gibt keine %s und eine RESET Farbe, um die Färbung zu beenden).

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

Auf diese Weise ist es einfach, wie etwas zu tun:

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

KNRM ist das gleiche mit RESET, oder? –

+0

Das ist eigentlich eine gute Frage. Ich nehme an, du hast Recht, aber ich kann nicht erklären warum. Ich meine, ist es genau der gleiche Code in einem anderen Format oder in verschiedenen Codes, die ein identisches Verhalten haben? –

+0

Ja, entsprechend Ihrem Beispiel sind sie etwas anders im Format (\ x1B und \ 033), aber ihr Verhalten ist das gleiche. –

Verwandte Themen