ANSI escape kód

ANSI escape kódy (anglicky ANSI escape codes) (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 (anglicky in-band). 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).[1]

První oblíbený videoterminál, který podporoval tyto posloupnosti, byl VT100 firmy Digital představený v roce 1978.[2] 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.[3] 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.[4]

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[5].

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ěř[Pozn 1] 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,[6] NANSI.SYS[7] 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 9xWindows 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ů,[8] 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ů 6495 (@_).

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 (anglicky Control Sequence Introducer nebo Control Sequence Initiator). Poslední znak těchto posloupností je ASCII znak z intervalu 64126 (@~).

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ů 0x800x9F 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 64126 (šestnáctkově 0x400x7E, ASCII @~) a může být modifikován středovými znaky z intervalu 3247 (hex 0x200x2F, ASCII mezera/).

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 4863 (hex 0x300x3F, 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 112126 (hex 0x700x7E, 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 32126 (hex 0x200x7E, ASCII mezera~) není chování terminálu definované. Tyto nepovolené znaky jsou buď řídicí znaky z řídicí sady C0 (z intervalu 031, hex 0x000x1F), znak 127 (hex 0x7F, ASCII DEL), anebo rozšířené ASCII znaky (intervalu 128255, hex 0x800xFF).

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 64126, hex 0x400x7E, ASCII@~);
  • Zpracovat všechny řídicí kódy jako kdyby byly mimo CSI posloupnost, a pak pokračovat v analýze zbytku posloupnosti.
Některé ANSI escape posloupnosti (neúplný seznam)
KódJménoEfekt

CSI n ACUU – Cursor UpPřesune kurzor o n (implicitně 1) buněk v daném směru. Pokud je kurzor už na okraji obrazovky, toto nemá žádný vliv.

CSI n BCUD – Cursor Down

CSI n CCUF – Cursor Forward

CSI n DCUB – Cursor Back
CSI n ECNL – Cursor Current LinePřesune kurzor na začátek řádku o n (implicitně 1) řádků níže. (ne ANSI.SYS)
CSI n FCPL – Cursor Previous LinePřesune kurzor na začátek řádku o n (implicitně 1) řádků výše. (ne ANSI.SYS)
CSI n GCHA – Cursor Horizontal AbsolutePřesune kurzor do sloupce n. (ne ANSI.SYS)

CSI n ; m HCUP – Cursor PositionPřesune kurzor na řádek n, sloupec m. Hodnoty začínají od jedničky a implicitní hodnota je také 1 (levý horní roh), pokud není uvedeno. Posloupnost jako například CSI ;5H je synonymem pro CSI 1;5H. Podobně CSI 17;H je totéž jako CSI 17H a CSI 17;1H

CSI n JED – Erase DisplaySmaže část obrazovky. Pokud n je 0 (nebo není uvedeno), smaže od pozice kurzoru do konce obrazovky. Pokud n je 1, smaže od pozice kurzoru do začátku obrazovky. Pokud n je 2, smaže celou obrazovku (a v ANSI.SYS v DOSu přesune kurzor do levého horního rohu).

CSI n KEL – Erase in LineVymaže část řádku. Pokud n je 0 (nebo není uvedeno), smaže od pozice kurzoru do konce řádku. Pokud n je 1, smaže od pozice kurzoru do začátku řádku. Pokud n je 2, smaže celý řádek. Pozice kurzoru se nezmění.

CSI n SSU – Scroll UpPosune celou stránku nahoru o n (implicitně 1) řádků. Přidá nové řádky dole. (ne ANSI.SYS)

CSI n TSD – Scroll DownPosune celou stránku dolů o n (implicitně 1) řádků. Přidá nové řádky nahoře. (ne ANSI.SYS)

CSI n ; m fHVP – Horizontal and Vertical PositionPřesune kurzor na řádek n, sloupec m. Není-li uvedena hodnota, implicitní hodnota je 1. Totéž jako CUP

CSI n mSGR – Select Graphic RenditionNastaví SGR parametry, včetně barvy textu. Po CSI může následovat žádný nebo více parametrů oddělených znaky ;. CSI m bez parametrů je interpretováno jako CSI 0 m (reset / normální), což je typické pro většinu ANSI escape posloupností.

CSI 5iAUX Port OffPovolí sériový port aux obvykle používaný pro lokální sériovou tiskárnu

CSI 4iAUX Port OnZakáže sériový port aux obvykle používaný pro lokální sériovou tiskárnu

CSI 6 nDSR – Device Status ReportOznámí aplikaci pozici kurzoru (CPR) jako (jako kdyby byla zadána z klávesnice) ESC[n;mR, kde n je řádek a m je sloupec.

CSI sSCP – Save Cursor PositionUloží pozici kurzoru.

CSI uRCP – Restore Cursor PositionObnoví pozici kurzoru.
CSI ?25lDECTCEMSkryje kurzor. (Poznámka: koncový znak je malé písmeno L.)
CSI ?25hDECTCEMZobrazí kurzor.
Parametry SGR (Select Graphic Rendition)
KódEfektPoznámka
0Reset / NormalVypne všechny atributy.
1Zvýšená intenzita
2Mdlejší (snížená intenzita)Málo podporované.
3Kurzíva: zapnutoMálo podporované. Bývá realizováno jako inverzní zobrazení.
4Podtržení: jednoduché
5Blikání: pomaléMéně než 150× za minutu.
6Blikání: rychléMS-DOS ANSI.SYS; více než 150× za minutu; málo podporované.
7Inverzní zobrazeníInverzní režim; prohodí barvu písma a pozadí (reverse video)
8SkrytéMálo podporované.
9PřeškrtnutéZnaky jsou čitelné, ale přeškrtnutím označené pro smazání; málo podporované.
10Primární (implicitní) font
11–19n-tý alternativní fontVybere n-tý alternativní font (14 je čtvrtý alternativní font, až 19 je devátý alternativní font).
20Gotické písmoPravděpodobně nikdy nepodporováno.
21Polotučné písmo: vypnuto nebo podtržení: dvojitéVypnutí polotučného písma je málo podporované; dvojité podtržení pravděpodobně nikdy nepodporováno.
22Normální barva nebo intenzitaNe jasnější ani mdlejší
23Bez kurzívy a gotického písma
24Podtržení: žádnéVypne jednoduché i dvojité podtrhávání.
25Blikání: vypnuto
26Rezervováno
27Zrušit inverzní zobrazení
28ZobrazitVypnutí skrytého textu
29Nepřeškrtnuté
30–37Nastaví barvu textu (popředí)30 + n, kde n je z tabulky barev uvedené níže.
38Rezervováno pro rozšířené nastavení barvy popředíTypické podporované další argumenty jsou 5;n kde n je číslo barvy (0..255) nebo 2;r;g;b kde r,g,b jsou intenzity červené, zelené a modré složky (0255).
39Implicitní barva textu (popředí)Definované implementací (podle standardu).
40–47Nastaví barvu pozadí40 + n, kde n je z tabulky barev uvedené níže.
48Rezervováno pro rozšířené nastavení barvy pozadítypické podporované další argumenty jsou 5;n kde n je číslo barvy (0..255) nebo 2;r;g;b kde r,g,b jsou intenzity červené, zelené a modré složky (max. 255).
49Implicitní barva pozadíDefinovaná implementací (podle standardu).
50Rezervováno
51V rámečku
52V oválu
53Nadtržení
54Bez rámečku a oválu
55Bez nadtržení
56–59Rezervováno
60Podtržení nebo čára vpravo od ideogramuPravděpodobně nikdy nepodporováno.
61Dvojité podtržení nebo dvojitá čára vpravo od ideogramuPravděpodobně nikdy nepodporováno.
62Nadtržení nebo čára vlevo od ideogramuPravděpodobně nikdy nepodporováno.
63Dvojité nadtržení nebo dvojitá čára vlevo od ideogramuPravděpodobně nikdy nepodporováno.
64Vyznačení přízvuku u ideogramuPravděpodobně nikdy nepodporováno.
65Vypnutí atributů u ideogramuzruší efekty kódů 6064; Pravděpodobně nikdy nepodporováno.
90–97Nastaví barvu textu (popředí), vysoká intenzitaaixterm (ne ve standardu)
100–107Nastaví barvu pozadí, vysoká intenzitaaixterm (ne ve standardu)

Barvy

Barvu textu (obecně SGR parametry) lze nastavit posloupností CSI n1 [;n2 [; ...]] m, kde n1, n2, … jsou parametry SGR uvedené výše. Pomocí kódů 30+i se mění barva textu, pomocí 40+i barva pozadí, přičemž i je číslo požadované barvy v následující tabulce.

Tabulka barev[Pozn 2]
Intensity01234567
Normálníčernáčervenázelenážlutá[Pozn 3]modráfialováazurovábílá
Jasnáčernáčervenázelenážlutámodráfialováazurovábílá

Na unixových systémech lze následující příklady vypsat příkazem printf, kde \x1b[ implementuje CSI: Kód \x1b[30m změní barvu písma na černou; kód \x1b[31m na červenou; pro přepnutí na šedou pomocí parametru „bold“ lze použít \x1b[30;1m; pro jasně červenou \x1b[31;1m. Pro opětovné nastavení barev na implicitní hodnoty lze použít \x1b[39;49m (což není podporováno na všech terminálech) nebo \x1b[0m (zrušení všech atributů).

Existují dva další standardy pro barvy: Standardní barvy pro CSS/HTML a X Window, který standardizují jak jména barev tak hodnoty RGB složek, ale standard pro escape posloupnosti určuje pouze jména barev, ne RGB hodnoty. V následující tabulce jsou shrnuty implicitní RGB hodnoty barev v některých rozšířených terminálových programech, spolu s hodnotami barev pro Kaskádové styly (CSS) a X Window System.

BarvaStandardní VGA barvyWindows XP CMDTerminal.appPuTTYmIRCxtermCSS/HTMLX
Normálníčerná0, 0, 00, 0, 00, 0, 00, 0, 00, 0, 00, 0, 00, 0, 00, 0, 0
červená170, 0, 0128, 0, 0194, 54, 33187, 0, 0127, 0, 0205, 0, 0255, 0, 0255, 0, 0
zelená0, 170, 00, 128, 037, 188, 360, 187, 00, 147, 00, 205, 00, 255, 00, 128, 0
hnědá/žlutá170, 85, 0128, 128, 0173, 173, 39187, 187, 0252, 127, 0205, 205, 0255, 255, 0255, 255, 0
modrá0, 0, 1700, 0, 12873, 46, 2250, 0, 1870, 0, 1270, 0, 2380, 0, 2550, 0, 255
fialová170, 0, 170128, 0, 128211, 56, 211187, 0, 187156, 0, 156205, 0, 205255, 0, 255255, 0, 255
azurová0, 170, 1700, 128, 12851, 187, 2000, 187, 1870, 147, 1470, 205, 2050, 255, 2550, 255, 255
šedá170, 170, 170192, 192, 192203, 204, 205187, 187, 187210, 210, 210229, 229, 229255, 255, 255255, 255, 255
Jasná/světlátmavošedá85, 85, 85128, 128, 128129, 131, 13185, 85, 85127, 127, 127127, 127, 127
červená255, 85, 85255, 0, 0252,57,31255, 85, 85255, 0, 0255, 0, 0
zelená85, 255, 850, 255, 049, 231, 3485, 255, 850, 252, 00, 255, 0144, 238, 144144, 238, 144
žlutá255, 255, 85255, 255, 0234, 236, 35255, 255, 85255, 255, 0255, 255, 0255, 255, 224225, 255, 224
modrá85, 85, 2550, 0, 25588, 51, 25585, 85, 2550, 0, 25292, 92, 255173, 216, 230173, 216, 230
fialová255, 85, 255255, 0, 255249, 53, 248255, 85, 255255, 0, 255255, 0, 255
azurová85, 255, 2550, 255, 25520, 240, 24085, 255, 2550, 255, 2550, 255, 255224, 255, 255224, 255, 255
bílá255, 255, 255255, 255, 255233, 235, 235255, 255, 255255, 255, 255255, 255, 255

Sloupec „Standardní VGA barvy“ obsahuje barvy, které jsou nastaveny při startu osobního počítače a jsou obvykle k dispozici v klasickém textovém režim 80×25. V grafických režimech EGA/VGA jsou barvy odlišné.

V červnu 2004 byly změněny odstíny modré barvy v xtermu,[9] RGB (0,0,205) → (0,0,238) pro normální modrou a (0,0,255) → (92,92,255) pro jasnější. Ještě v roce 2010 však byla na mnoha počítačích nainstalována stará verze xtermu.

Xterm,[10] GNOME Terminal a Konsole v KDE[11] podporuje 24bitové nastavení barev písma (popředí) a pozadí podle ISO-8613-3. Ze zdrojových textů lze zjistit následující sekvence:[12]

  • ESC[ … 38;2;<r>;<g>;<b> … m – vybere RGB barvu písma (popředí)
  • ESC[ … 48;2;<r>;<g>;<b> … m – vybere RGB barvu pozadí

V režimu s 256 barvami (ESC[38;5;<fgcode>m a ESC[48;5;<bgcode>m) se používají následující barevné kódy:

  • 0x00-0x07: standardní barvy (jako pro ESC[ 30–37 m)
  • 0x08-0x0F: vysoká intenzita barvy (jako pro ESC[ 90–97 m)
  • 0x10-0xE7: 6 × 6 × 6 = 216 barev: 16 + 36 × r + 6 × g + b (0 ≤ r, g, b ≤ 5)
  • 0xE8-0xFF: škála šedé od černé po bílou ve 24 krocích

Také xterm umožňuje změnit implicitní barvu písma a pozadí pomocí[10]

   ESC]10;<popředí>BEL
   ESC]11;<pozadí>BEL

kde <popředí> a <pozadí> jsou jména barev v X11 a BEL je ASCII znak BEL (s kódem 7). Použití pravé hranaté závorky místo levé ukazuje, že se jedná o řídicí příkazy operačního systému.

Příklady

CSI 2 J – Vymaže obrazovku a na některých zařízeních umístí kurzor na pozici y,x = 1,1 (do levého horního rohu).

CSI 32 m – Přepne na zelený text. V MS-DOSu je normální zelená mdlá a tmavá, takže je vhodnější pomocí posloupnosti CSI 1 m přepnout na vyšší jas nebo použít kombinaci CSI 32 ; 1 m, což dává jasně zelenou. MS-DOS ANSI.SYS používá stav Bold pro zobrazení jasnějších znaků; lze také zapnout stav blikání (pomocí INT 10, AX 1003h, BL 00h), který v některých případech zobrazí pozadí v jasněji. MS-DOS ANSI.SYS SGR kódy 90–97 a 100–107 přímo nepodporoval.

CSI 0 ; 6 8 ; "DIR" ; 13 p – Přeprogramuje klávesu F10, aby posílala do bufferu klávesnice řetězec „DIR“ a kód klávesy Enter, což v příkazovém řádku DOSu vypíše obsah aktuálního adresáře (pouze MS-DOS ANSI.SYS). Tato posloupnost byla někdy používána pro ANSI bomby. Jedná se o proprietární kód (indikovaný písmenem p), který umožňuje pomocí nestandardních rozšíření zadat řetězcové parametry. Podle standardu by posloupnost měla končit písmenem D.

CSI s – Uloží pozici kurzoru. Posloupnost CSI u pozici kurzoru obnoví. Aktuální pozice kurzoru může být např. 7(y), 10(x). Posloupnost CSI s tato dvě čísla uloží. Pak je možné přesunout kurzor na jinou pozici, například 20(y) a 3(x), pomocí posloupnosti CSI 20 ; 3 H nebo CSI 20 ; 3 f. Pak lze posloupností CSI u vrátit kurzor na pozici 7(y), 10(x). Na některých terminálech je třeba použít DEC posloupnosti ESC 7 a ESC 8, které jsou více podporované.

Příklad použití v shellových skriptech

Unixové terminály často používají ANSI escape kódy pro zvýrazňování syntaxe. Například následující příkaz zobrazí na kompatibilních terminálech jména souborů a adresářů různými barvami podle typu souboru.

ls --color

Uživatelé mohou používat escape kódy ve svých skriptech jejich začleněním do standardního výstup nebo standardního chybového výstupu. Například následující příkaz pro sed zvýrazní výstup příkazu make zobrazením řádků obsahujících slova začínající (malá a velká písmena se nerozlišují) „WARN“ použitím inverzního videa a slova začínající „ERR“ světle žlutým písmem na tmavě červeném pozadí. Reprezentace kódů jsou zvýrazněny.[13]

make 2>&1 | sed -e 's/.*\bWARN.*/\x1b[7m&\x1b[0m/i' -e 's/.*\bERR.*/\x1b[93;41m&\x1b[0m/i'

Následující funkce shellu rozbliká terminál (střídavým posíláním kódů pro inverzní a normální videorežim) dokud uživatel nestiskne klávesu.[14]

flasher () { while true; do printf \\e[?5h; sleep 0.1; printf \\e[?5l; read -s -n1 -t1 && break; done; }

To lze použít pro upozornění programátora, že příkaz, jehož provedení trvá dlouho, již skončil, jako například make; flasher .[15]

Používané chybné a nejednoznačné posloupnosti

  • Linuxová konzole používá pro změnu palety posloupnost OSC P n rr gg bb. Pokud je tato posloupnost pevně zakódována do aplikace, může způsobit zamrznutí jiných terminálů. Připojení ST na konec bude Linuxem ignorováno a vytváří správnou, ignorovatelnou posloupnost pro jiné terminály.
  • Určité funkční klávesy na Linuxových konzolích generují posloupnosti tvaru CSI [ znak. CSI posloupnosti musí být zakončeny znakem [.
  • Staré verze terminálového emulátoru Terminator generují SS3 1; modifikátory znak, při stisknutí kláves F1–F4 s modifikátory. Chybné chování bylo zkopírováno z programu GNOME Terminal.
  • Program xterm na dotaz na pozici kurzoru vrací CSI řádek ; sloupec R a CSI 1 ; modifikátory R, jestliže byla stisknuta klávesa F3 s modifikátory, což způsobuje kolizi, pokud řádek má hodnotu 1. Tomu se lze vyhnout použitím soukromého modifikátoru ?, který bude zopakován v odezvě.
  • Mnoho terminálů předřazuje kód ESC před kódy znaků zadaných na klávesnici se stisknutou klávesou Alt. To vede k nejednoznačnosti u velkých písmen a symbolů @[\]^_, které by dávaly kódy z řídicí sady C1.
  • Konsole generuje SS3 modifikátory znak při stisknutí kláves F1–F4 s modifikátory.

Odkazy

Poznámky

  1. 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.
  2. Jména jsou standardní, ale přesný odstín, intenzita a světlost barvy nejsou standardizovány a závisí na zařízení, na kterém budou zobrazeny.
  3. Na terminálech kompatibilních s CGA, například na ANSI.SYS v DOSu, se tato barva zobrazuje jako oranžová až hnědá. CGA RGBI monitory obsahovaly hardware, který omezením zelené komponenty měnil tmavě žlutou barvu na oranžovou nebo hnědou. Viz tato ukázka ansi art Archivováno 25. 7. 2011 na Wayback Machine..

Reference

V tomto článku byl použit překlad textu z článku ANSI escape code na anglické Wikipedii.

  1. Viz seznam zrušených standardů Archivováno 1. 8. 2010 na Wayback Machine. NIST
  2. Paul Williams. Digital's Video Terminals [online]. VT100.net, 2006 [cit. 2011-08-17]. Dostupné v archivu pořízeném dne 2012-07-23. 
  3. Heathkit Company. Heathkit Catalog 1979 [online]. Heathkit Company, 1979 [cit. 2011-11-04]. Dostupné v archivu pořízeném dne 2012-01-13. 
  4. Amiga Printer Command Definitions [online]. Commodore [cit. 2013-07-10]. Dostupné online. 
  5. Using C-Kermit [online]. Dostupné online. [nedostupný zdroj]
  6. Michael Mefford. ANSI.com: Download It Here [online]. PC Magazine, 1989-02-07 [cit. 2011-08-10]. Dostupné online. 
  7. Dan Kegel, Eric Auer. Nansi and NNansi - ANSI Drivers for MS-DOS [online]. Dan Kegel, 1999-02-28 [cit. 2011-08-10]. Dostupné online. 
  8. colorama 0.2.5 : [online]. [cit. 2013-08-17]. Dostupné online. 
  9. Patch #192 - 2004/7/12 - XFree86 4.4.99.9 [online]. Dostupné online. 
  10. a b XTerm Control Sequences [online]. 2014-01-13 [cit. 2014-04-13]. Dostupné online. 
  11. color-spaces.pl (a copy of 256colors2.pl from xterm dated 11 July 1999) [online]. KDE, 2006-12-06. Dostupné online. 
  12. README.moreColors [online]. KDE, 2010-04-22. Dostupné online. 
  13. Colorized shell echo
  14. VT100.net: Digital VT100 User Guide [online]. Dostupné online. 
  15. bash - How to get a notification when my commands are done - Ask Different [online]. Dostupné online. 

Související články

Externí odkazy