2010-08-27 20 views
87

Tôi bắt đầu viết một trình soạn thảo văn bản đầu cuối, giống như trình soạn thảo văn bản đầu tiên cho UNIX, chẳng hạn như vi. Mục tiêu duy nhất của tôi là có thời gian tốt, nhưng tôi muốn có thể hiển thị màu văn bản, vì vậy tôi có thể làm nổi bật cú pháp để chỉnh sửa mã nguồn.Văn bản màu trong các ứng dụng đầu cuối trong UNIX

Tôi làm cách nào để đạt được điều này? Có một số API POSIX đặc biệt cho điều này không, hoặc tôi có phải sử dụng ncurses không? (Tôi không muốn)

Bạn có lời khuyên nào không? Có lẽ một số sách giáo khoa trên API UNIX?

Trả lời

139

Đây là một chương trình C nhỏ mà minh họa làm thế nào bạn có thể sử dụng mã màu:

#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"); 'là sạch hơn và nhanh hơn so với sử dụng'% s'. –

+10

Điều này đặt màu mặc định mãi mãi sau màu văn bản mới này. Để thiết lập nó trở lại sử dụng KNRM ban đầu. – Schroeder

+0

Có thể sử dụng một màu cụ thể (có lẽ với các giá trị RGB như '880000' cho màu đỏ đậm, vv), hoặc chúng ta bị mắc kẹt với 8 màu trong ví dụ trên? – anthropomorphic

14

Sử dụng trình tự thoát ANSI. This article đi vào một số chi tiết về chúng. Bạn cũng có thể sử dụng chúng với printf.

67

Dưới đây là một cách khác để làm điều đó. Một số người sẽ thích điều này vì mã này sạch hơn một chút (không có %s và màu RESET để kết thúc màu).

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

Bằng cách này, thật dễ dàng để làm một cái gì đó như:

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

KNRM giống với RESET, phải không? –

+0

Đó thực sự là một câu hỏi hay. Tôi đoán bạn nói đúng nhưng tôi không thể giải thích tại sao. Tôi có nghĩa là, nó là cùng một mã chính xác trong một định dạng khác nhau hoặc các mã khác nhau có một hành vi giống hệt nhau? –

+0

Có, theo ví dụ của bạn, chúng có chút khác biệt về định dạng (\ x1B và \ 033) nhưng hành vi của chúng giống nhau. –

Các vấn đề liên quan