Preskočiť na obsah

ANSI escape kódy

ANSI escape kód je krátka postupnosť znakov, ktorú program vypíše, aby terminálu povedal, nech urobí niečo iné, než tie znaky zobrazí — zafarbí ďalšie slová načerveno, posunie kurzor o dva riadky hore, zmaže obrazovku. Terminál sekvenciu pohltí a vykoná ju; preto log plný týchto kódov vyzerá v editore ako šum.

Každý kód nižšie začína escape bajtom a — s jednou výnimkou — otváracou zátvorkou. Stĺpec s parametrom uvádza časť medzi zátvorkou a koncovým písmenom, teda to, čo skladáte v kóde; prvý stĺpec ukazuje celú sekvenciu tak, ako by ste ju napísali v shelli.

Podpora sa medzi terminálmi líši a táto stránka to tam, kde na tom záleží, uvádza. Osem základných farieb a tučné písmo fungujú všade; blikanie, dvojité podčiarknutie a true color nie.

Anatómia sekvencie

6

Každý kód na tejto stránke má rovnaký tvar: escape bajt, otváracia zátvorka, parametre a jedno písmeno, ktoré hovorí, čo s nimi.

SekvenciaParameterÚčinok
\e0x1BEscape bajt, ktorým začína každá sekvenciaV shelli sa píše \e, v C \033, vo väčšine jazykov \x1b a v JSON a Jave \u001b.
\e[CSIControl Sequence Introducer — otvára príkaz s parametrami
\e[<n>mmSelect Graphic Rendition: všetko okolo farieb a štýlu končí písmenom m
\e[1;4;31m1;4;31Viac parametrov naraz, oddelených bodkočiarkamiTučné, podčiarknuté a červené v jednej sekvencii — kratšie než tri samostatné a s rovnakým účinkom.
\e[0m0Vráti všetky atribúty na predvolené nastavenie termináluVypíšte ho na konci farebného výstupu. Program, ktorý ho vynechá, nechá používateľovi zafarbený prompt.
\e]8;;URL\e\\text\e]8;;\e\\OSC 8Klikateľný hypertextový odkaz v termináloch, ktoré ho podporujúIde o OSC, nie CSI sekvenciu, a ukončuje ju ESC \ namiesto písmena.

Atribúty textu

14

Podpora je nerovnomerná okrem prvých piatich. Blikanie takmer nikde nefunguje a niekoľko terminálov zobrazuje slabé a kurzívu rovnako.

SekvenciaParameterÚčinok
\e[1m1Tučné alebo jasné
\e[2m2Slabé
\e[3m3Kurzíva
\e[4m4Podčiarknutie
\e[5m5BlikanieVäčšinou sa ignoruje; moderné terminály ho zobrazia ako obyčajný text.
\e[7m7Inverzia: vymení popredie a pozadie
\e[8m8Skryté: text existuje, ale nevykreslí sa
\e[9m9Prečiarknutie
\e[21m21Dvojité podčiarknutieNiektoré terminály čítajú 21 ako „zrušiť tučné“.
\e[22m22Normálna intenzita: ruší tučné aj slabé
\e[23m23Ruší kurzívu
\e[24m24Ruší podčiarknutie
\e[27m27Ruší inverziu
\e[29m29Ruší prečiarknutie

Farba textu

17

Osem štandardných farieb a ich jasné náprotivky. To, čo čitateľ naozaj vidí, je výklad jeho témy terminálu — „červená“ je pozícia v palete, nie hex hodnota.

SekvenciaParameterÚčinok
\e[30m30Čierna text
\e[31m31Červená text
\e[32m32Zelená text
\e[33m33Žltá text
\e[34m34Modrá text
\e[35m35Purpurová text
\e[36m36Azúrová text
\e[37m37Biela text
\e[39m39Späť na predvolenú farbu textu
\e[90m90Jasná čierna text
\e[91m91Jasná červená text
\e[92m92Jasná zelená text
\e[93m93Jasná žltá text
\e[94m94Jasná modrá text
\e[95m95Jasná purpurová text
\e[96m96Jasná azúrová text
\e[97m97Jasná biela text

Farba pozadia

17

Rovnaká paleta posunutá o desať. Kód pozadia nastaví bunku za textom a platí, kým sa nezruší.

SekvenciaParameterÚčinok
\e[40m40Čierna pozadie
\e[41m41Červená pozadie
\e[42m42Zelená pozadie
\e[43m43Žltá pozadie
\e[44m44Modrá pozadie
\e[45m45Purpurová pozadie
\e[46m46Azúrová pozadie
\e[47m47Biela pozadie
\e[49m49Späť na predvolené pozadie
\e[100m100Jasná čierna pozadie
\e[101m101Jasná červená pozadie
\e[102m102Jasná zelená pozadie
\e[103m103Jasná žltá pozadie
\e[104m104Jasná modrá pozadie
\e[105m105Jasná purpurová pozadie
\e[106m106Jasná azúrová pozadie
\e[107m107Jasná biela pozadie

256 farieb a true color

4

Dve rozšírenia toho istého SGR mechanizmu. Obe sú široko, no nie univerzálne podporované; terminál, ktorý im nerozumie, sekvenciu zvyčajne ignoruje namiesto toho, aby ju vypísal.

SekvenciaParameterÚčinok
\e[38;5;<n>m38;5;nText vo farbe palety n, 0 – 2550 – 15 je šestnástka vyššie, 16 – 231 farebná kocka 6×6×6, 232 – 255 stupnica šedej.
\e[48;5;<n>m48;5;nPozadie vo farbe palety n, 0 – 255
\e[38;2;<r>;<g>;<b>m38;2;r;g;bText v presnej 24-bitovej farbe
\e[48;2;<r>;<g>;<b>m48;2;r;g;bPozadie v presnej 24-bitovej farbe

Pohyb kurzora

11

Presuny neposúvajú obraz ani nezalamujú: kurzor, ktorý už je hore na obrazovke, ignoruje požiadavku ísť vyššie.

SekvenciaParameterÚčinok
\e[<n>AAO n riadkov hore
\e[<n>BBO n riadkov dole
\e[<n>CCO n stĺpcov doprava
\e[<n>DDO n stĺpcov doľava
\e[<n>EEO n riadkov dole, na začiatok riadka
\e[<n>FFO n riadkov hore, na začiatok riadka
\e[<n>GGNa stĺpec n v aktuálnom riadku
\e[<row>;<col>HHNa absolútny riadok a stĺpec, počítané od 1
\e[ssZapamätá si pozíciu kurzora
\e[uuVráti sa na zapamätanú pozíciu
\e[6n6nSpýta sa terminálu, kde je kurzorTerminál odpovie na štandardný vstup ako \e[<riadok>;<stĺpec>R — jediná sekvencia tu, ktorá vracia odpoveď.

Mazanie

7

Mazanie zapíše medzery s aktuálnou farbou pozadia; kurzorom nepohne.

SekvenciaParameterÚčinok
\e[0J0JZmaže od kurzora do konca obrazovky
\e[1J1JZmaže od začiatku obrazovky po kurzor
\e[2J2JZmaže celú obrazovkuKurzor zostane, kde bol — preto sa zvyčajne kombinuje s \e[H.
\e[3J3JZmaže aj históriu posúvania
\e[0K0KZmaže od kurzora do konca riadka
\e[1K1KZmaže od začiatku riadka po kurzor
\e[2K2KZmaže celý riadok\r\e[2K je bežný spôsob, ako prekresliť riadok s priebehom na mieste.

Režimy terminálu

8

Privátne režimy, označené otáznikom. Menia správanie terminálu, nie vzhľad jedného kusu textu, a každý z nich treba pred ukončením programu vrátiť späť.

SekvenciaParameterÚčinok
\e[?25l?25lSkryje kurzor
\e[?25h?25hZobrazí kurzor
\e[?1049h?1049hPrepne na alternatívnu obrazovkuTo, čo používa celoobrazovkový program, aby história shellu pod ním prežila.
\e[?1049l?1049lPrepne späť na hlavnú obrazovku
\e[?7h?7hZalomí dlhé riadky na pravom okraji
\e[?7l?7lNechá dlhé riadky pretiecť za pravý okraj
\e[?2004h?2004hZapne bracketed pasteVložený text príde obalený v \e[200~ a \e[201~, takže shell rozozná písanie od vkladania.
\e[?2004l?2004lVypne bracketed paste

Časté otázky

Prečo zostane výstup zafarbený aj po skončení programu?
Pretože ho nič nevrátilo späť. Kód farby platí, kým ho nenahradí iný, takže program, ktorý skončí uprostred farby, odovzdá shellu zafarbený prompt. Pred ukončením vypíšte \e[0m — aj na chybovej vetve, na ktorú sa najčastejšie zabúda.
Aký je rozdiel medzi \e, \033 a \x1b?
Žiadny. Všetky tri sú ten istý bajt 0x1B, zapísaný tak, ako ho píše konkrétny jazyk: \e v bashi a zsh, \033 v C a v echo -e, \x1b v Pythone, Go, Ruste a JavaScripte, \u001b tam, kde je povolený len unicode escape, teda v JSON a Jave.
Ako ich odstránim z log súboru?
Vložte ho do nástroja na odstránenie ANSI kódov na tejto stránke. Odstráni sekvencie farieb, kurzora aj režimov a farby vie namiesto zahodenia previesť do HTML alebo Markdownu — čo chcete vtedy, keď bolo zvýraznenie zmyslom logu.
Mám farby písať priamo, alebo použiť knižnicu?
Pri čomkoľvek dlhšom než pár riadkoch použite knižnicu — overí, či je výstup vôbec terminál. Kódy farieb zapísané do rúry alebo súboru v ňom zostanú, a presne tak sa do build logov dostane šum.
Je tučné to isté ako jasné?
Historicky áno a na niektorých termináloch dodnes. Kód 1 bol definovaný ako tučné, no mnohé terminály ho implementovali prepnutím na jasnú polovicu palety, takže tučná červená a jasná červená môžu vyzerať rovnako. Rozsah 90 – 97 existuje práve preto, aby sa dalo pýtať jasné bez tučného.