Programowanie w języku C/C++ » Artykuły

Kolorowy terminal w UNIXie

  • 2008-09-10 16:00
  • 6 komentarzy
  • 2721 odsłon
  • Oceń ten tekst jako pierwszy
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
[email protected]
www.cepa.one.pl

6 komentarzy

lukaszjanda 2009-02-20 08:52

super :D naprawde przydatne :D

TeMPOraL 2005-02-06 16:37

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.

ŁF 2005-02-03 16:36

strikethrough - tekst przekreślony

cepa 2005-02-03 08:30

tyle ze nie zawsze jest  to oplacalne :)

_TeStON_ 2005-02-03 00:04

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