2010-08-27 17 views
87

Comencé a escribir un editor de texto de terminal, algo así como los primeros editores de texto para UNIX, como vi. Mi único objetivo es pasar un buen rato, pero quiero poder mostrar el texto en color, para que pueda resaltar la sintaxis para editar el código fuente.Texto de color en aplicaciones de terminal en UNIX

¿Cómo puedo lograrlo? ¿Hay alguna API POSIX especial para esto, o tengo que usar ncurses? (Preferiría no)

¿Algún consejo? Tal vez algunos libros de texto en la API de UNIX?

Respuesta

139

Este es un pequeño programa en C que ilustra cómo se puede utilizar códigos de color:

#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");' es mucho más limpio y más rápido que el uso de '% s'. –

+10

Esto establece el color predeterminado para siempre después de este nuevo color de texto. Para volver al original, utilice KNRM. – Schroeder

+0

¿Es posible usar un color específico (quizás con valores RGB como '880000' para rojo oscuro, etc.), o estamos atascados con los 8 colores en el ejemplo anterior? – anthropomorphic

14

Utilice secuencias de escape ANSI. This article entra en detalles sobre ellos. Puede usarlos también con printf.

67

Ésta es otra manera de hacerlo. Algunas personas preferirán esto ya que el código es un poco más limpio (no hay %s y un color RESET para finalizar la coloración).

#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 esta manera, es fácil de hacer algo como:

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

KNRM es lo mismo con RESET, ¿no es así? –

+0

Esa es en realidad una buena pregunta. Supongo que tienes razón, pero no puedo explicar por qué. Quiero decir, ¿es exactamente el mismo código en un formato diferente o códigos diferentes que tienen un comportamiento idéntico? –

+0

Sí, de acuerdo con su ejemplo, son un poco diferentes en formato (\ x1B y \ 033) pero su comportamiento es el mismo. –

Cuestiones relacionadas