ANSI escape kódy () (nebo escape posloupnosti) je metoda pro řízení formátování, barev a dalších vlastností výstupu na obrazovkové textové terminály pomocí signalizace v přenosovém kanálu (). Pro zakódování formátovacích informací se do textu vkládají určité posloupnosti bytů, které terminál neinterpretuje jako kódy znaků, ale jako příkazy.
ANSI kódy byly vytvořeny v 70. letech 20. století a do začátku 80. let 20. století se rozšířily v oblasti minipočítačů a sálových počítačů. K jejich dalšímu rozšíření přispěly vznikající BBS, které je využívaly ke zlepšení ovládání displeje oproti dřívějším systémům, které obvykle postrádaly schopnost pohybovat kurzorem.
Přestože hardwarové textové terminály téměř vymizely, ANSI escape kódy se používají i v 21. století, protože většina terminálových emulátorů při výstupu textu interpretuje alespoň část ANSI escape posloupností.
MS Windows znovu podporují ANSI od verze 10 (Build 1511), pro předchozí verze lze použít celou škálu utilit interpretujících ANSI kódy (jako např. Ansicon). Tyto lze metodou BIN2HEX (např. program BHX) přibalit do scriptu a ten následně redistribuovat. V roce 2019 MS vydal Windows Terminal (ten má v budoucnu nahradit Windows consoli) a který obsahuje vylepšenou podporu ANSI sekvencí, jako třeba 16bit barvy. To je umožněno díky grafickému módu, který WT používá, namísto textového který používá původní Windows console.
Historie Většina výrobců obrazovkových terminálů vyvinula proprietární escape posloupnosti pro ovládání terminálů pomocí operací, které umožňovaly např. umístit kurzor na libovolné místo na obrazovce. Např. terminál VT52 přesune kurzor na pozici x,y, pokud se na něj odešle znak ESC následovaný znakem y a dvěma znaky s kódy x+32 nebo y+32 (přičtením 32 se zabrání, aby escape sekvence obsahovala řídicí znaky).
Protože různé terminály používaly různé posloupnosti, byly vytvořeny komplikované knihovny jako například termcap, které vytvářejí jednotné API pro ovládání libovolného terminálu. Většina těchto knihoven vyžadovala, aby se čísla (např. číslo řádku a sloupce) odesílala jako binární hodnoty znaků; pro některé programovací jazyky a pro systémy, které nepoužívaly interně ASCII, bylo často obtížné nebo nemožné převést číslo na správný znak.
ANSI standard usiloval o vyřešení těchto problémů vytvořením sady příkazů, které by používaly všechny terminály, a u nichž by všechny číselné informace byly přenášeny v textovém tvaru. Prvním takovým standardem byl ECMA-48, přijatý v roce 1976, který navazoval na řadu standardů pro kódování znaků, z nichž první byl ECMA-6 z roku 1961, 7bitový standard, který inspiroval kódování ASCII. Název „ANSI escape posloupnosti“ pochází z roku 1981, kdy ANSI převzalo ECMA-48 jako vlastní standard ANSI X3.64 (který platil do roku 1997).Viz seznam zrušených standardů NIST
První oblíbený videoterminál, který podporoval tyto posloupnosti, byl VT100 firmy Digital představený v roce 1978. Tento model se velmi dobře prodával, což vedlo ke vzniku množství jeho klonů, z nichž k prvním a nejoblíbenějším patřil mnohem levnější Zenith Z-19 z roku 1979. Oblíbenost těchto terminálů vedla k tomu, že stále více a více softwaru (zvláště systémy BBS) předpokládalo, že escape posloupnosti fungují, což vedlo k tomu, že je podporovaly téměř všechny nové terminály a emulátory.
Standard ECMA-48 byl několikrát aktualizován a aktuálně je v pátém vydání z roku 1991. ECMA-48 převzala ISO a IEC jako standard ISO/IEC 6429.
Podpora Velkého rozšíření ANSI díky systémům BBS a online službám vedlo k téměř univerzální platformní podpoře do poloviny 80. let 20. století. Ve většině případů měla podpora formu terminálového emulátoru (jako například xterm na Unixu nebo OS X Terminal nebo ZTerm na MacOSu a mnoho komunikačních programů pro IBM PC), ale na mnoha operačních systémech se zlepšovala i podpora ve standardním textovém výstupu.
Unix a AmigaOS obsahovaly podporu ANSI sekvencí v systému, takže ji používalo mnoho programů běžících na těchto platformách. Na unixových operačních systémech jsou k dispozici knihovny, jako například termcap a curses, které používání ANSI kódů umožňují. Tyto knihovny by měly podporovat i neANSI terminály, ale tato podpora se v současnosti testuje jenom zřídka, takže je pravděpodobné, že nebude bezchybná. Mnoho her a shellových skriptů (jako například barevné systémové nápovědy) přímo vypisují ANSI posloupnosti a proto je nelze používat na terminálech, které je neumějí interpretovat.
AmigaOS interpretuje ANSI escape posloupnosti nejen v textovém výstupu na obrazovku, ale ovladače tiskáren je (včetně rozšíření proprietárních pro AmigaOS) převádí na kódy pro konkrétní připojenou tiskárnu.
Přes svou oblíbenost nebyly ANSI kódy univerzálně podporované. Podpora nebyla součástí původního „klasického“ Mac OS, Atari ST používalo řídicí posloupnosti převzaté z VT52 s některými rozšířeními pro podporu barev.
Windows a DOS MS-DOS 1.x žádnou podporu ANSI ani jiných escape posloupností neobsahoval. Podkladový BIOS interpretoval pouze několik řídicích znaků (BEL, CR, LF, BS), což téměřVykreslení celé obrazovky bylo možné postupným vypsáním všech řádků a odscrollováním předchozí obrazovky vzhůru tak, aby veškerý starší text zmizel. Nevýhodou je, že uživatel vidí scrollování, a hardwarový kurzor zůstává na spodním řádku obrazovky. Některé starší dávkové soubory používaly tuto metodu pro zdánlivě celoobrazovkový výstup. znemožňovalo vytváření celoobrazovkových aplikací. Pro jakékoli obrazovkové efekty bylo nutné požít BIOS, což bylo velmi pomalé, nebo přímo hardware IBM PC.
DOS 2.0 umožňuje instalovat ovladače zařízení a obsahuje ovladač pro ANSI escape posloupnosti – de facto standardem je ANSI.SYS, ale existují další (výrazně rychlejší, protože obcházejí BIOS) jako ANSI.COM, NANSI.SYS a ANSIPLUS.EXE. Protože standardní ovladač byl velmi pomalý a nebyl nainstalován implicitně, používalo ANSI sekvence jen velmi málo programů; většina programů přímo přistupovala k hardwaru videokarty, aby dosáhla požadovaných efektů při textovém výstupu. ANSI.SYS a podobné ovladače byly dostupné ve Windows 9x až Windows Me i v prostředí pro 16bitové starší programy prováděné pod NTVDM v systémech vycházejících z Windows NT.
Windows ANSI escape sekvence od verze 10 opět podporují, dokonce s 24bitovými barvami. Toho je dosaženo tím, že terminálový program [connhost.exe] byl převeden z textového módu do grafického, což umožňuje full-screen provoz konzole.
Některé programy ANSI escape posloupnosti ve výstupních textech interně interpretují a převádějí je na volání služeb, které manipulují s barvami a pozicí kurzoru v okně pro výstup příkazů, což usnadňuje portování softwaru používajícího ANSI na Windows.
Struktura ANSI Escape posloupností Escape posloupnosti začínají znakem ESC (ASCII desítkově 27/šestnáctkově 0x1B/osmičkově 033). Ve dvouznakových posloupnostech je druhý znak z intervalu ASCII kódů 64–95 (@ až _).
Většina posloupností je však tvořena více než dvěma znaky a začínají znaky ESC a [ (levou hranatou závorkou). Tato posloupnost se nazývá CSI (). Poslední znak těchto posloupností je ASCII znak z intervalu 64–126 (@ až ~).
Existuje i jednoznakové CSI (155/0x9B /0233 viz řídicí sada C1), ale dvouznaková posloupnost ESC[ se používá častěji.
Zařízeními, které podporují pouze ASCII (7bitové byty), rozpoznávají pouze dvouznakové CSI, stejně jako zařízení, které sice podporují 8bitové byty, ale interval řídicích znaků 0x80–0x9F používají pro jiné účely. Na terminálech, které používají kódování UTF-8, oba tvary zabírají 2 byty (CSI v UTF-8 je 0xC2, 0x9B), ale posloupnost ESC[ je jasnější.
Přestože některá kódování používají více bytů na znak, následující diskuze je omezená na ASCII znaky a tedy předpokládají jeden byte pro každý znak.
Jiné než CSI kódy Poznámka: jiné kódy z řídicí sady C0 než ESC – obvykle BEL, BS, CR, LF, FF, TAB, VT, SO a SI – mohou produkovat podobné nebo stejné efekty jako některé řídicí posloupnosti.
ESC N = SS2 ESC O = SS3 Vybere jeden znak z alternativní znakové sady. ESC ^ = PM ESC _ = APC Za těmito znaky následuje textový řetězec zakončený symbolem ST (ESC \). Program xterm je ignoruje. ESC P = DCS Řetězce pro řízení zařízení, ESC ] = OSC Příkaz operačního systému – podobají se CSI, ale nejsou omezené celočíselnými argumenty. Protože jsou často používané, v mnoha případech je BEL přijatelnou alternativou k ST. Např. v xtermu lze zapnout titulek okna pomocí "OSC0;Toto je titulek oknaBEL"
Poznámka: stisknutí speciálních kláves na klávesnici nebo vypsání různých CSI, DCS nebo OSC posloupností v xtermu často produkuje CSI, DCS nebo OSC posloupnost.
CSI kódy Obecná struktura většiny ANSI escape posloupností je CSI [znak(y) pro soukromý režim] n1 ; n2... [středové znaky] koncový znak. Koncový znak je písmeno určující příkaz, který může být modifikován znaky pro soukromý režim a středovými znaky. Čísla jsou nepovinné parametry; pokud jsou vynechány, implicitní hodnota závisí na příkazu; obvykle je 1 nebo 0. Jsou-li parametry vynechané, lze vynechat i následující středník.
Koncový znak je technicky libovolný znak z intervalu 64–126 (šestnáctkově 0x40–0x7E, ASCII @ až ~) a může být modifikován středovými znaky z intervalu 32 až 47 (hex 0x20–0x2F, ASCII mezera až /).
Dvojtečka (58, hex 0x3A) je jediným znakem, který není částí žádné obecné escape sekvence. Byl ponechán pro budoucí standardizaci, takže všechny escape sekvence, které obsahují dvojtečku, musí být ignorovány.
Přestože je povoleno více znaků pro soukromý režim i středových znaků, není známo, že by byly používány.
Pokud posloupnost začíná nějakým znakem pro soukromý režim, tělo posloupnosti teoreticky může obsahovat libovolnou posloupnost znaků z intervalu 48–63 (hex 0x30–0x3F, ASCII 0 až ?) místo dobře utvořených seznamů čísel oddělených středníky, ale všechny známé terminály se chovají slušně a používají znaky z tohoto intervalu jiné než číslice pouze jako příznaky. Posloupnosti, jejichž poslední byte je z intervalu 112–126 (hex 0x70–0x7E, ASCII p–~) jsou také soukromé.
Mezi soukromé escape kódy patří DECTCEM (DEC text cursor enable mode) popsaný dále, který se objevil u videoterminálů řady VT-300.
Pokud CSI posloupnost obsahuje libovolný znak mimo interval 32 až 126 (hex 0x20–0x7E, ASCII mezera–~) není chování terminálu definované. Tyto nepovolené znaky jsou buď řídicí znaky z řídicí sady C0 (z intervalu 0–31, hex 0x00–0x1F), znak 127 (hex 0x7F, ASCII DEL), anebo rozšířené ASCII znaky (intervalu 128–255, hex 0x80–0xFF).
Existuje několik možností, jak zpracovávat nepovolené znaky v CSI posloupnostech:
Předpokládat, že CSI posloupnost končí, ignorovat ji a považovat další znaky za data; Ignorovat celou posloupnost včetně všech následujících znaků až po znak, který by normálně CSI posloupnost ukončoval (znak z intervalu 64–126, hex 0x40–0x7E, ASCII@–~); Zpracovat všechny řídicí kódy jako kdyby byly mimo CSI posloupnost, a pak pokračovat v analýze zbytku posloupnosti.