Kolorowy terminal w UNIXie

cepa

Kolorowy UNIX czyli jak zrobic festyn z terminala :P

Od dawien dawna ludzkość nurtował problem wyświetlania
kolorowych znaków w terminalu unixowym...

Objawieniem okazały się kody ANSI kolorów!

Co to w ogóle jest ?
Kody ANSI kolorów to nic innego jak specjalne prefixy,
które interpretuje terminal i ustawia nam odpowiednie
parametry wyświetlania textu.
Każdy kod ANSI zaczyna się znakiem ESC czyli kodem
ASCII 27 (0x1B), następnie jest znak '[', numer kodu,
i znak 'm', czyli schemat wygląda tak (kolejne bajty):

ESC,'[',<numer textowo="textowo">,'m'

Jak używać kodów ANSII ?
Aby uzyskać jakiś efekt wystarczy użyć zwykłej funkcji
do zapisywania na standardowym wyjsciu (stdout), np:

printf("\x1b[1m moj text \n");

Powyższa funkcja powinna wyświetlić lekko pogrubiony
napis ' moj text '.

Standard oferuje nam następujące kody:

[0m - reset
resetuje wszystkie wczesniejsze ustawienia do
trybu domyślnego (czarno biały terminal)

[1m - bold on
włącza pogrubienie

[3m - italics on
włącza kursywa

[4m - underline on
włącza podkreślenie

[7m - inverse on
odwraca ustawienia kolorów, zamienia kolor tła
z kolorem textu i na odwrót

[9m - strikethrough on
włącza przekreślenie

[22m - bold off
wyłącza pogrubienie

[23m - italics off
wyłącza kursywe

[24m - underline off
wyłącza podkreślenie

[27m - inverse off
wyłącza tryb odwrócenia ustawień

[29m - strikethrough off
wyłącza przekreślenie

[30m - fg black
kolor textu - czarny

[31m - fg red
kolor textu - czerwony

[32m - fg green
kolor textu - zielony

[33m - fg yellow
kolor textu - żółty

[34m - fg blue
kolor textu - niebieski

[35m - fg magneta
kolor textu - magneta

[36m - fg cyan
kolor textu - cyan

[37m - fg white
kolor textu - biały

[39m - fg default
domyślny kolor textu (najczęściej biały)

[40m - bg black
kolor tła - czarny

[41m - bg red
kolor tła - czerwony

[42m - bg green
kolor tła - zielony

[43m - bg yellow
kolor tła - żółty

[44m - bg blue
kolor tła - niebieski

[45m - bg magneta
kolor tła - magneta

[46m - bg cyan
kolor tła - cyan

[47m - bg white
kolor tła - biały

[49m - bg default
domyślny kolor tła (najczęściej czarny)

I to by było na tyle, poniżej jest prosty program
wyświetlający kolorowy text.

UWAGA! Jeżeli wasz DOS lub Windows ma zainstalowany
sterownik ANSI to prawdopodobnie kolory ANSI będą
działać na tych systemach.

/* ANSI color codes examples */

#include <stdio.h>

const char ansi[] =
{
  "\x1b[0m"
  "\x1b[1m\x1b[30m\x1b[47m     ___          ___          ___                \x1b[0m\n"
  "\x1b[1m\x1b[30m\x1b[47m    /  /\\        /__/\\        /  /\\       ___     \x1b[0m\n"
  "\x1b[1m\x1b[30m\x1b[47m   /  /::\\       \\  \\:\\      /  /:/_     /  /\\    \x1b[0m\n"
  "\x1b[1m\x1b[33m\x1b[44m  /  /:/\\:\\       \\  \\:\\    /  /:/ /\\   /  /:/    \x1b[0m\n"
  "\x1b[1m\x1b[33m\x1b[44m /  /:/~/::\\  _____\\__\\:\\  /  /:/ /::\\ /__/::\\    \x1b[0m\n"
  "\x1b[1m\x1b[33m\x1b[44m/__/:/ /:/\\:\\/__/::::::::\\/__/:/ /:/\\:\\\\__\\/\\:\\__ \x1b[0m\n"
  "\x1b[1m\x1b[34m\x1b[42m\\  \\:\\/:/__\\/\\  \\:\\~~\\~~\\/\\  \\:\\/:/~/:/   \\  \\:\\/\\\x1b[0m\n"
  "\x1b[1m\x1b[34m\x1b[42m \\  \\::/      \\  \\:\\  ~~~  \\  \\::/ /:/     \\__\\::/\x1b[0m\n"
  "\x1b[1m\x1b[34m\x1b[42m  \\  \\:\\       \\  \\:\\       \\__\\/ /:/      /__/:/ \x1b[0m\n"
  "\x1b[1m\x1b[37m\x1b[41m   \\  \\:\\       \\  \\:\\        /__/:/       \\__\\/  \x1b[0m\n"
  "\x1b[1m\x1b[37m\x1b[41m    \\__\\/        \\__\\/        \\__\\/               \x1b[0m\n"
  "\x1b[1m\x1b[37m\x1b[41m                                                  \x1b[0m\n"
  "\x1b[0m"
};  


int main()
{
  printf("%s\n", ansi);
  
  return 0;
} 

/* EOF */

Copyright (C) By CEPA 2005
cepa@o2.pl
www.cepa.one.pl

6 komentarzy

super :D naprawde przydatne :D

Małe uzupełnienie - ciągi kolorujące specyfikuje się tak: ZNAK_ESC[kody_formatum, gdzie kodów może być więcej i są one wtedy oddzielone średnikiem. Przykład - \033[00;01;32m - daje nam kolor jasnozielony. 00 jest po to, żeby zresetować wcześniejsze formatowanie, np. podkreślenie, którego w przykładzie nie chemy. Wszystkie podane kody są dobre, tylko trzeba je czytać nie jako [kodm, tylko jako samą liczbę - bo może ich być więcej pomiędzy [ a m. Pozdrawiam.

strikethrough - tekst przekreślony

tyle ze nie zawsze jest to oplacalne :)

Przyda sie.. ale moim zdaniem wygodniej sie korzysta z biblioteki "ncurses.h" odrazu obsluga okienek, kolorow itp.