Portál AbcLinuxu, 1. května 2025 02:08

ANSI řídící sekvence

23.7.2008 08:26 | Přečteno: 1869× | Linux

Pokud chcete do konzole vypisovat barevný text máte v podstatě dvě možnosti. Můžete na to jít od lesa a použít nějakou knihovnu (například ncurses nebo slang). Nebo použít ANSI Escape sekvence, které jsou s námi již více než 30 let.

Escape sekvence jsou kombinace znaků uvozené znakem escape (ASCII 27 [nebo také 033 a 0x1b]). Terminál by neměl tyto sekvence vypisovat, ale interpretovat. Pomocí escape sekvencí můžeme měnit základní parametry terminálu - barva popředí, barva pozadí nebo pozice kurzoru. Můžeme také vykonávat základní operace jako smazání obrazovky, řádku, nebo dokonce zjišťovat parametry terminálu.

Tento blogpost vychází z článku který vyšel na mém webu, kde najdete také jednoduchou knihovnu v Céčku. Kdyby mi něco na webu nefungovalo dejte mi vědět, nedávno jsem přešel na Drupal (o RSS vím).

Barvičky a atributy textu

Barvy a atributy textu se nastavují pomocí escape sekvence ESC[x;x;xm kde se na místech x uvádí jednotlivé atributy.

Barvy jsou číslovány následovně: Černá (0), Červená (1), Zelená (2), Žlutá (3), Modrá (4), Fialová (5), Azurová (6) a Bílá (7). Číslo 9 reprezentuje defaultní barvu. Pokud se barva používá, přičítá se k ní 30 pro barvu popředí, nebo 40 pro barvu pozadí.

Narozdíl od barev není podpora atributů textu moc dobrá. Terminály obvykle znají všechny atributy, nicméně vizuální podoba se výrazně liší terminál od terminálu.

Základní podporované atributy textu jsou: Světlý (1), Tmavý (2), Podtržený (4), Blikající (5), Inverzní (7) a Skrytý (8). Nula reprezentuje reset atributů.

Pokud by jste chtěli například nastavit prompt terminálu tak, aby zobrazoval váš login podtrženým fialovým písmem na azurovém pozadí za kterým by následovala blikající pravá hranatá závorka v červené barvě na bílem pozadí, udělali by jste to nějak tahle:

export PS1="\033[4;35;46m`whoami`\033[0m\033[5;31;47m]\033[0m"

Reset atributů uprostřed příkazu je potřebný kvůli podtržení. Bez něj by byla hranatá závorka nejenom blikající, ale i podtržená.

Ostatní funkce

Pomocí sekvence ESC[2J můžeme vymazat celou obrazovku a pomocí ESC[x;yf můžeme přesunout kurzor na řádek x a sloupec y. Obrazovku je možné také mazat relativně od kurzoru nebo pouze na řádku kde je kurzor. S kurzorem je zase možné hýbat relativně vůči aktuální pozici (pro detaily mrkněte do článku nebo na wikipedii).

       

Hodnocení: 86 %

        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

23.7.2008 09:55 zde | skóre: 9 | blog: Linuch | Brno
Rozbalit Rozbalit vše Re: ANSI řídící sekvence
Odpovědět | Sbalit | Link | Blokovat | Admin
Zmínil bych man console_codes, je to poměrně přehledné i kompletní. Curses je hnusný kód s neuvěřitelně ošklivým API.
Táto, ty de byl? V práci, já debil.
23.7.2008 13:02 R
Rozbalit Rozbalit vše Re: ANSI řídící sekvence
Riadiace kody ma kazdy terminal ine. Curses funguje na vsetkych terminaloch. Nie je to az take hrozne, jednoduche UI som v tom robil.
23.7.2008 13:49 Let_Me_Be | skóre: 20 | blog: cat /proc/idea/current | Brno
Rozbalit Rozbalit vše Re: ANSI řídící sekvence
To neni tak uplne pravda. ANSI kody by meli fungovat vsude (i kdyz bohuzel nektere funguji ruzne na ruznych terminalech).
Linked in profil - Můj web - Nemůžete vyhrát hádku s blbcem. Nejdřív vás stáhne na svoji úroveň a pak ubije zkušenostmi.
23.7.2008 14:59 MJ | Tady a teď
Rozbalit Rozbalit vše Re: ANSI řídící sekvence
To žel není pravda. Podívejte se do databáze od terminfa a uvidíte, kolik existuje obskurních terminálů.
23.7.2008 15:30 Let_Me_Be | skóre: 20 | blog: cat /proc/idea/current | Brno
Rozbalit Rozbalit vše Re: ANSI řídící sekvence
Jo, napsal jsem to trochu spatne. Myslel jsem to tak ze kazdy terminal ma obvykle svoje vlastni ridici sekvence, nicmene ANSI funguje vicemene globalne, ale ano podivnych terminalu je spousta.
Linked in profil - Můj web - Nemůžete vyhrát hádku s blbcem. Nejdřív vás stáhne na svoji úroveň a pak ubije zkušenostmi.
23.7.2008 14:32 CEST
Rozbalit Rozbalit vše Re: ANSI řídící sekvence
Navic IMHO je na ANSI ESCAPE sekvence hezky prave to, ze se to da pouzivat jako obycejny echo/print z cehokoliv i z bashe a perlu. Pokud se nepletu, tak ncurses je knihovna pro C. Samozrejme, urcite existujou moduly do perlu a ruzny dalsi rozsireni do shellu, ale to hezky je prave pouziti ANSI ESCAPE sekvenci je prave ta jednoduchost. Blby pak ovsem je, kdyz si takovej skript clovek spusti v terminalu, kterej ty sekvence neumi:-(
23.7.2008 15:00 MJ | Tady a teď
Rozbalit Rozbalit vše Re: ANSI řídící sekvence
V shellu můžete používat příkaz `tput', který si umí najít řídící sekvence v terminfu.

Pro Perl existují docela příjemné bindingy na curses (modul Curses). Nic úžasného, ale určitě příjemnější než sekvence bastlit ručně.
24.7.2008 08:41 Tom.š Ze.le.in | skóre: 21 | blog: tz
Rozbalit Rozbalit vše Re: ANSI řídící sekvence
Kromě tput-u lze také přímo použít pro nastavování setterm.

Založit nové vláknoNahoru

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.