Sdílet prostřednictvím


Sekvence virtuálních terminálů konzoly

Sekvence virtuálních terminálů jsou sekvence řídicích znaků, které mohou řídit pohyb kurzoru, barvu konzoly a další operace při zápisu do výstupního datového proudu. Sekvence mohou být také přijaty ve vstupním datovém proudu v reakci na sekvenci s informacemi o výstupním streamu dotazu nebo jako kódování uživatelského vstupu při nastavení příslušného režimu.

Ke konfiguraci tohoto chování můžete použít funkce GetConsoleMode a SetConsoleMode . Na konci tohoto dokumentu je uvedena ukázka navrhovaného způsobu, jak povolit chování virtuálních terminálů.

Chování následujících sekvencí je založeno na technologiích emulátoru terminálu VT100 a odvozených, především emulátoru terminálu xterm. Další informace o sekvencích terminálu najdete na http://vt100.net adrese a na adrese http://invisible-island.net/xterm/ctlseqs/ctlseqs.html.

Výstupní sekvence

Následující sekvence terminálu jsou zachyceny hostitelem konzoly při zápisu do výstupního datového proudu, pokud je příznak ENABLE_VIRTUAL_TERMINAL_PROCESSING nastaven na popisovač vyrovnávací paměti obrazovky pomocí funkce SetConsoleMode . Všimněte si, že příznak DISABLE_NEWLINE_AUTO_RETURN může být také užitečný při emulaci umístění kurzoru a posouvání chování jiných emulátorů terminálu vzhledem k znakům zapsaným do konečného sloupce v libovolném řádku.

Jednoduché umístění kurzoru

Ve všech následujících popisech je esc vždy šestnáctková hodnota 0x1B. Do sekvence terminálu se nezahrnou žádné mezery. Jednotlivé sekvence terminálu je možné rozdělit na libovolný znak nebo bajtovou pozici napříč několika sekvenčními voláními WriteFile nebo WriteConsole , ale doporučuje se zahrnout celou posloupnost do jednoho volání. Příklad použití těchto sekvencí v praxi najdete v příkladu na konci tohoto tématu.

Následující tabulka popisuje jednoduché řídicí sekvence s jedním příkazem akce přímo za znakem ESC. Tyto sekvence nemají žádné parametry a projeví se okamžitě.

Všechny příkazy v této tabulce jsou obecně ekvivalentní volání rozhraní API konzoly SetConsoleCursorPosition k umístění kurzoru.

Pohyb kurzoru bude ohraničen aktuálním zobrazením do vyrovnávací paměti. K posouvání (pokud je k dispozici) nedojde.

Sekvence Těsnopis Chování
ESC M RI Reverzní index – provádí obrácenou operaci \n, přesune kurzor o jednu čáru nahoru, udržuje vodorovnou pozici, v případě potřeby posunuje vyrovnávací paměť*
ESC 7 DECSC Uložit pozici kurzoru v paměti**
ESC 8 DECSR Obnovit pozici kurzoru z paměti**

Poznámka:

* Pokud jsou nastavené posuvné okraje, ri uvnitř okrajů se posune jenom obsah okrajů a ponechá oblast zobrazení beze změny. (Viz Posuvné okraje)

**Do prvního použití příkazu save nebude uložena žádná hodnota v paměti. Jediným způsobem, jak získat přístup k uložené hodnotě, je příkaz restore.

Umístění kurzoru

Následující tabulky zahrnují sekvence typů CSI (Control Sequence Introducer). Všechny sekvence CSI začínají klávesou ESC (0x1B) následovanou [ (levá hranatá závorka, 0x5B) a mohou obsahovat parametry proměnné délky, aby bylo možné zadat další informace pro každou operaci. Bude reprezentován zkratkou <n>. Jednotlivé níže uvedené tabulky jsou seskupené podle funkcí s poznámkami pod každou tabulkou, která vysvětluje, jak skupina funguje.

Pro všechny parametry platí následující pravidla, pokud není uvedeno jinak:

  • <n> představuje vzdálenost k pohybu a je volitelný parametr.
  • Pokud <není argument n> vynechán nebo se rovná 0, bude považován za 1.
  • <n> nemůže být větší než 32 767 (maximální krátká hodnota)
  • <N> nemůže být záporné.

Všechny příkazy v této části jsou obecně ekvivalentní volání rozhraní API konzoly SetConsoleCursorPosition .

Pohyb kurzoru bude ohraničen aktuálním zobrazením do vyrovnávací paměti. K posouvání (pokud je k dispozici) nedojde.

Sekvence Code Popis Chování
ESC [ <n> A CUU Kurzor nahoru Kurzor nahoru o <n>
ESC [ <n> B ŽVANEC Kurzor dolů Kurzor dolů o <n>
ESC [ <n> C CUF Kurzor vpřed Kurzor vpřed (vpravo) o <n>
ESC [ <n> D LIŠTIČKA Kurzor dozadu Kurzor dozadu (vlevo) o <n>
ESC [ <n> E CNL Další řádek kurzoru Kurzor o <n> řádků od aktuální pozice
ESC [ <n> F CPL Kurzor – předchozí řádek Kurzor o <n> řádků od aktuální pozice
ESC [ <n> G CHA Kurzor – vodorovné absolutní Kurzor se přesune na <n>pozici vodorovně v aktuálním řádku.
ESC [ <n> d VPA Absolutní pozice svislé čáry Kurzor se přesune na <n>. pozici svisle v aktuálním sloupci.
ESC [ <y> ; <x> H ŠÁLEK Pozice kurzoru *Kurzor se přesune na <x>; <souřadnice y> v oblasti zobrazení, kde <x> je sloupec <y čáry y>
ESC [ <y> ; <x> f HVP Vodorovná svislá pozice *Kurzor se přesune na <x>; <souřadnice y> v oblasti zobrazení, kde <x> je sloupec <y čáry y>
ESC [ s ANSISYSSC Uložit kurzor – emulace Ansi.sys **Bez parametrů provede operaci uložení kurzoru, jako je DECSC.
ESC [ u ANSISYSRC Obnovit kurzor – Ansi.sys emulace **Bez parametrů provede operaci obnovení kurzoru, jako je DECRC.

Poznámka:

*<x> a <y> parametry mají stejná omezení jako <n> výše. Pokud <argument x> a <y> vynecháte, nastaví se na hodnotu 1;1.

**ANSI.sys historickou dokumentaci najdete na https://msdn.microsoft.com/library/cc722862.aspx adrese a je implementována pro usnadnění/kompatibilitu.

Viditelnost kurzoru

Následující příkazy řídí viditelnost kurzoru a jeho blikající stav. Sekvence DECTCEM jsou obecně ekvivalentní volání SetConsoleCursorInfo rozhraní API konzoly k přepnutí viditelnosti kurzoru.

Sekvence Code Popis Chování
ESC [ ? 12 h ATT160 Povolit blikající kurzor textu Spuštění blikajícího kurzoru
ESC [ ? 12 l ATT160 Kurzor textu zakažte blikající Zastavení blikajícího kurzoru
ESC [ ? 25 h DECTCEM Zobrazení režimu povolení kurzoru textu Zobrazení kurzoru
ESC [ ? 25 l DECTCEM Skrytí režimu povolení kurzoru textu Skrytí kurzoru

Tip

Povolení sekvencí končí malými písmeny H (h) a deaktivuje sekvence končí malými písmeny L (l).

Obrazec kurzoru

Následující příkazy řídí a umožňují přizpůsobení obrazce kurzoru.

Sekvence Code Popis Chování
ESC [ 0 SP q DECSCUSR Obrazec uživatele Výchozí obrazec kurzoru nakonfigurovaný uživatelem
ESC [ 1 SP q DECSCUSR Blikající blok Blikající obrazec kurzoru bloku
ESC [ 2 SP q DECSCUSR Stabilní blok Obrazec konstantního blokového kurzoru
ESC [ 3 SP q DECSCUSR Blikající podtržení Blikající obrazec kurzoru podtržení
ESC [ 4 SP q DECSCUSR Stabilní podtržení Stabilní obrazec kurzoru podtržení
ESC [ 5 SP q DECSCUSR Blikající pruh Blikající obrazec kurzoru pruhu
ESC [ 6 SP q DECSCUSR Stabilní pruh Obrazec kurzoru stabilního pruhu

Poznámka:

SP je literálový znak mezery (0x20) v prostřední pozici a q následuje (0x71) v konečné pozici.

Umístění oblasti zobrazení

Všechny příkazy v této části jsou obecně ekvivalentní volání ScrollConsoleScreenBuffer rozhraní API konzoly pro přesunutí obsahu vyrovnávací paměti konzoly.

Opatrnost Názvy příkazů jsou zavádějící. Posouvání označuje, ve kterém směru se text během operace přesune, a ne na to, jakým způsobem by se oblast zobrazení pravděpodobně přesunula.

Sekvence Code Popis Chování
ESC [ <n> S SU Posunout nahoru Posun textu nahoru o <n>. Označuje se také jako posun dolů, nové řádky se vyplňují ze spodní části obrazovky.
ESC [ <n> T SD Scrollovat dolů Posuňte se dolů o <n>. Označuje se také jako posun nahoru, nové řádky se vyplňují z horní části obrazovky.

Text se přesune od řádku, na který je kurzor zapnutý. Pokud je kurzor na prostředním řádku oblasti zobrazení, posuňte se nahoru a přesuňte dolní polovinu oblasti zobrazení a vložte do dolní části prázdné řádky. Posunutím dolů byste přesunuli horní polovinu řádků oblasti zobrazení a vložili do horní části nové řádky.

Je také důležité si uvědomit, že posouvání nahoru a dolů je také ovlivněno posouváním okrajů. Posunutí nahoru a dolů neovlivní žádné čáry mimo okraje posouvání.

Výchozí hodnota pro <n> je 1 a je možné ji volitelně vynechat.

Úprava textu

Všechny příkazy v této části jsou obecně ekvivalentní volání FillConsoleOutputCharacter, FillConsoleOutputAttribute a ScrollConsoleScreenBuffer rozhraní API konzoly pro úpravu obsahu vyrovnávací paměti textu.

Sekvence Code Popis Chování
ESC [ <n> @ ICH Vložit znak Vložte <n> mezer na aktuální pozici kurzoru a posunujte veškerý existující text doprava. Text opouštějící obrazovku vpravo se odebere.
ESC [ <n> P DCH Odstranit znak Odstraňte <n> znaků na aktuální pozici kurzoru a posunujte se v mezerách od pravého okraje obrazovky.
ESC [ <n> X ECH Vymazat znak Vymažte <n> znaků z aktuální pozice kurzoru tak, že je přepíšete znakem mezery.
ESC [ <n> L IL Vložit řádek <Vloží n> řádků do vyrovnávací paměti na pozici kurzoru. Čára, na které je kurzor, a řádky pod ním se posunou směrem dolů.
ESC [ <n> M DL Odstranit řádek <Odstraní n> řádků z vyrovnávací paměti, počínaje řádkem, na který je kurzor zapnutý.

Poznámka:

U il a DL jsou ovlivněny pouze čáry na okraji posouvání (viz Posuvné okraje). Pokud nejsou nastavené žádné okraje, výchozí ohraničení okrajů je aktuální oblast zobrazení. Pokud by se řádky přesunuly pod okraje, zahodí se. Při odstranění řádků se prázdné řádky vloží do dolní části okrajů, řádky mimo oblast zobrazení se nikdy nedotknou.

Pro každou sekvenci je výchozí hodnota n<>, pokud je vynechána, 0.

Pro následující příkazy má parametr <n> 3 platné hodnoty:

  • 0 se vymaže od aktuální pozice kurzoru (včetně) na konec řádku nebo zobrazení.
  • 1 vymaže od začátku řádku nebo zobrazení nahoru a včetně aktuální pozice kurzoru.
  • 2 vymaže celý řádek/displej.
Sekvence Code Popis Chování
ESC [ <n> J ED Vymazat v zobrazení Nahrazení veškerého textu v aktuálním výřezu nebo obrazovce určeném <n> znaky mezery
ESC [ <n> K EL Vymazat v řádku Nahraďte veškerý text na řádku kurzorem určeným <n> znaky mezery.

Formátování textu

Všechny příkazy v této části jsou obecně ekvivalentní volání SetConsoleTextAttribute konzolová rozhraní API pro úpravu formátování všech budoucích zápisů do výstupní textové vyrovnávací paměti konzoly.

Tento příkaz je speciální v tom, že <n> pozice níže může přijímat mezi 0 a 16 parametry oddělenými středníky.

Pokud nejsou zadány žádné parametry, považuje se za stejný jako s jedním parametrem 0.

Sekvence Code Popis Chování
ESC [ <n> m SGR Nastavení verze grafiky Nastavení formátu obrazovky a textu podle hodnoty <n>

Následující tabulka hodnot se dá použít v <n> k reprezentaci různých režimů formátování.

Režimy formátování se použijí zleva doprava. Použití konkurenčních možností formátování způsobí, že přednost má možnost nejvíce vpravo.

U možností, které určují barvy, se barvy použijí tak, jak jsou definovány v tabulce barev konzoly, které lze upravit pomocí rozhraní Api SetConsoleScreenBufferInfoEx . Pokud je tabulka upravena tak, aby v tabulce zobrazovala "modrou" pozici, zobrazí se barva RGB červenou, všechna volání do popředí Modrá zobrazí tuto červenou barvu, dokud se nezmění jinak.

Hodnota Popis Chování
0 Výchozí Vrátí všechny atributy do výchozího stavu před úpravou.
1 Tučné/světlé Použije příznak jasu a intenzity na barvu popředí.
22 Bez tučného/jasného Odebere příznak jasu a intenzity z barvy popředí.
4 Podtržení Přidá podtržení.
dvacet čtyři Bez podtržení Odebere podtržení.
7 Záporný Prohození barev popředí a pozadí
27 Kladné (bez negativního) Vrátí hodnotu popředí nebo pozadí do normálního stavu.
30 Popředí – černá Použije ne tučné nebo světlé černé na popředí.
31 Popředí – červená Použije ne tučné nebo jasně červené na popředí.
32 Popředí – zelená Použije ne tučné nebo jasné zelené na popředí.
33 Popředí – žlutá Použije ne tučné nebo jasné žluté na popředí.
34 Popředí – modrá Použije ne tučné nebo jasné modré na popředí.
35 Popředí Purpurová Použije ne tučné nebo jasné purpurové na popředí.
36 Azurová popředí Použije ne tučné nebo jasné azurové na popředí.
37 Popředí – bílá Použije na popředí ne tučné nebo světlé bílé písmo.
38 Rozšířené popředí Použije rozšířenou hodnotu barvy na popředí (viz podrobnosti níže).
39 Výchozí popředí Použije pouze část výchozích hodnot popředí (viz 0).
40 Pozadí – černá Použije na pozadí ne tučné nebo světlé černé pozadí.
41 Pozadí – červená Použije na pozadí ne tučné nebo jasné červené písmo.
42 Pozadí – zelená Použije na pozadí ne tučné nebo světlé zelené pozadí.
43 Pozadí – žlutá Použije na pozadí ne tučné nebo světlé žluté písmo.
44 Modrá pozadí Použije na pozadí ne tučné nebo světlé modré písmo.
45 Purpurová pozadí Použije na pozadí ne tučné nebo jasné purpurové písmo.
46 Pozadí azurové Použije ne tučné nebo jasné azurové pozadí.
47 Bílé pozadí Použije na pozadí jiné než tučné nebo světlé bílé.
48 Rozšířené pozadí Použije rozšířenou hodnotu barvy na pozadí (viz podrobnosti níže).
49 Výchozí nastavení pozadí Použije pouze část výchozích hodnot na pozadí (viz 0).
90 Světlé popředí – černá Použije tučné nebo jasné černé na popředí.
91 Světlé popředí – červená Použije tučné nebo jasně červené na popředí.
92 Světlé popředí – zelená Použije tučné nebo jasné zelené písmo na popředí.
93 Světlé popředí – žlutá Použije tučné nebo jasně žluté na popředí.
94 Světlé popředí – modrá Použije tučné nebo jasné modré na popředí.
95 Světlé popředí Purpurová Použije tučné nebo jasné purpurové písmo na popředí.
96 Světlé popředí azurové Použije tučné nebo jasné azurové na popředí.
97 Světlé popředí – bílá Použije tučné nebo světlé bílé na popředí.
100 Světlé pozadí – černé Použije tučné nebo světlé černé pozadí.
101 Světlé pozadí – červená Použije tučné nebo jasné červené pozadí.
102 Světlé pozadí – zelená Použije tučné nebo světlé zelené pozadí.
103 Světlé pozadí – žlutá Použije tučné nebo světlé žluté pozadí.
104 Světlé pozadí – modrá Použije tučné nebo světlé modré pozadí.
105 Světlé pozadí Purpurová Použije tučné nebo jasné purpurové pozadí.
106 Světlé pozadí azurové Použije tučné nebo jasné azurové pozadí.
107 Světlé pozadí bílé Použije tučné nebo světlé bílé pozadí.

Rozšířené barvy

Některé emulátory virtuálního terminálu podporují paletu barev větších než 16 barev poskytovaných konzolou Systému Windows. U těchto rozšířených barev vybere konzola Windows nejbližší odpovídající barvu z existující 16 barevné tabulky pro zobrazení. Na rozdíl od výše uvedených typických hodnot SGR budou rozšířené hodnoty využívat další parametry po počátečním indikátoru podle následující tabulky.

Dílčí sekvence SGR Popis
38 ; 2 ; <r> ; <g> ; <b> Nastavte barvu popředí na hodnotu RGB zadanou v <parametrech r>, <g>, <b> *
48 ; 2 ; <r> ; <g> ; <b> Nastavení barvy pozadí na hodnotu RGB zadanou v <r>, <g>, <b> parametrech*
38 ; 5 ; <s> Nastavení barvy popředí na <> index v tabulce 88 nebo 256 barev*
48 ; 5 ; <s> Nastavení barvy pozadí na <> index ve 88 nebo 256 barevné tabulce*

*Barevné palety 88 a 256 udržované interně pro porovnání jsou založeny z emulátoru terminálu xterm. Tabulky porovnání a zaokrouhlování nelze v tuto chvíli změnit.

Barvy obrazovky

Následující příkaz umožňuje aplikaci nastavit hodnoty palety barev obrazovky na libovolnou hodnotu RGB.

Hodnoty RGB by měly být šestnáctkové hodnoty mezi 0 a ffa oddělené znakem lomítka (např. rgb:1/24/86).

Všimněte si, že tato sekvence je posloupnost operačního systému operačního systému, nikoli csI, jako je řada ostatních uvedených sekvencí, a jako například začínat na \x1b], nikoli "\x1b[". Jako sekvence OSC jsou ukončeny řetězcovým ukončovacím znakem reprezentovaným jako <ST> a přenášeny (ESC \0x1B 0x5C). BEL (0x7) lze místo toho použít jako ukončovací znak, ale delší forma je upřednostňovaná.

Sekvence Popis Chování
ESC ] 4 ; <i> ; rgb : <r> / <g> / <b><ST> Úprava barev obrazovky Nastaví index <palety barev obrazovky i> na hodnoty RGB zadané v <r>, <g>, <b.>

Změny režimu

Jedná se o sekvence, které řídí režimy vstupu. Existují dvě různé sady vstupních režimů, režim kláves kurzoru a režim klávesových kláves. Režim kláves kurzoru řídí sekvence, které jsou generovány šipkovými klávesami i klávesami Home a End, zatímco režim kláves klávesnice řídí sekvence generované klávesami na numerické klávesnici, a také funkční klávesy.

Každý z těchto režimů je jednoduché logické nastavení – režim kláves kurzoru je normální (výchozí) nebo aplikace a režim klávesových kláves je číselný (výchozí) nebo aplikace.

Pro sekvence generované v těchto režimech se podívejte na oddíly Kurzorové klávesy a Numpad a Klíče funkcí.

Sekvence Code Popis Chování
ESC = DECKPAM Povolení režimu aplikace klávesnice Klávesy klávesnice vygenerují sekvence režimu aplikace.
ESC > DECKPNM Povolení číselného režimu klávesnice Klávesy klávesnice budou generovat posloupnosti číselného režimu.
ESC [ ? 1 h DECCKM Povolit režim aplikace Kurzorové klávesy Klávesy klávesnice vygenerují sekvence režimu aplikace.
ESC [ ? 1 l DECCKM Zakázání režimu aplikace kurzorových kláves (použití normálního režimu) Klávesy klávesnice budou generovat posloupnosti číselného režimu.

Stav dotazu

Všechny příkazy v této části jsou obecně ekvivalentní volání rozhraní Get* console API k načtení informací o stavu aktuálního stavu vyrovnávací paměti konzoly.

Poznámka:

Tyto dotazy vygenerují své odpovědi do vstupního datového proudu konzoly hned po rozpoznání ve výstupním datovém proudu, zatímco je nastavená ENABLE_VIRTUAL_TERMINAL_PROCESSING. Příznak ENABLE_VIRTUAL_TERMINAL_INPUT se nevztahuje na příkazy dotazu, protože se předpokládá, že aplikace provádějící dotaz bude vždy chtít odpověď přijmout.

Sekvence Code Popis Chování
ESC [ 6 n DECXCPR Pozice kurzoru sestavy Vygenerujte pozici kurzoru jako: ESC [ <r> ; <c> R Where <r> = cursor row and <c> = cursor column
ESC [ 0 c DA Atributy zařízení Nahlaste identitu terminálu. Bude generovat "\x1b[?1; 0c" označující "VT101 bez možností".

Tabulátory

Zatímco konzola windows tradičně očekává, že karty budou výhradně osm znaků široké, *nix aplikace využívající určité sekvence mohou manipulovat s místem, kde jsou zarážky tabulátoru v oknech konzoly pro optimalizaci pohybu kurzoru aplikací.

Následující sekvence umožňují aplikaci nastavit umístění zarážky tabulátoru v okně konzoly, odebrat je a procházet mezi nimi.

Sekvence Code Popis Chování
ESC H HTS Vodorovná sada karet Nastaví zarážku tabulátoru v aktuálním sloupci, ve které je kurzor.
ESC [ <n> I CHT Kurzor – vodorovná karta (vpřed) Umístěte kurzor na další sloupec (ve stejném řádku) se zarážkou tabulátoru. Pokud nejsou žádné další zarážky tabulátoru, přejděte na poslední sloupec v řádku. Pokud je kurzor v posledním sloupci, přejděte na první sloupec dalšího řádku.
ESC [ <n> Z CBT Karta Kurzor vzad Přesuňte kurzor na předchozí sloupec (ve stejném řádku) se zarážkou tabulátoru. Pokud nejsou žádné další zarážky tabulátoru, přesune kurzor do prvního sloupce. Pokud je kurzor v prvním sloupci, nepřesune kurzor.
ESC [ 0 g TBC Vymazat tabulátor (aktuální sloupec) Pokud existuje, vymaže zarážku tabulátoru v aktuálním sloupci. Jinak nic nedělá.
ESC [ 3 g TBC Vymazat tabulátor (všechny sloupce) Vymaže všechny aktuálně nastavené zarážky tabulátoru.
  • Pro CHT i CBT je n> volitelný parametr, <který (default=1) udává, kolikrát má kurzor přejít v zadaném směru.
  • Pokud nejsou v HTS nastavené žádné zarážky tabulátoru, bude funkce CHT a CBT považovat první a poslední sloupce okna za jediné dvě zarážky tabulátoru.
  • Použití HTS k nastavení zarážky tabulátoru také způsobí, že konzola přejde na další zarážku tabulátoru ve výstupu znaku TAB (0x09, '\t') stejným způsobem jako funkce CHT.

Určení znakové sady

Následující sekvence umožňují programu změnit mapování aktivní znakové sady. To umožňuje programu generovat 7bitové znaky ASCII, ale mají je zobrazeny jako jiné glyfy na samotné obrazovce terminálu. V současné době jsou jedinými dvěma podporovanými znakovými sadami ASCII (výchozí) a sada speciálních grafických znaků DEC. Podívejte http://vt100.net/docs/vt220-rm/table2-4.html se na seznam všech znaků reprezentovaných speciální grafickou znakovou sadou DEC.

Sekvence Popis Chování
ESC ( 0 Určení znakové sady – kreslení čar DEC Povolí režim kreslení čar DEC.
ESC ( B Určení znakové sady – US ASCII Povolí režim ASCII (výchozí).

Režim kreslení čar DEC se používá zejména pro kreslení ohraničení v konzolových aplikacích. Následující tabulka ukazuje, jaké znaky ASCII mapuje na který znak kreslení čáry.

Hexadecimální standard ASCII Výkres čáry DEC
0x6a j
0x6b k
0x6c l
0x6d m
0x6e n
0x71 q
0x74 t
0x75 u
0x76 v
0x77 w
0x78 x

Posouvání okrajů

Následující sekvence umožňují programu konfigurovat "oblast posouvání" obrazovky, která je ovlivněna operacemi posouvání. Jedná se o podmnožinu řádků, které se upraví, když se obrazovka jinak posune, například na\nnebo RI. Tyto okraje mají vliv také na řádky upravené příkazem Vložit řádek (IL) a Odstranit čáru (DL), posunout nahoru (SU) a posunout dolů (SD).

Posuvné okraje můžou být užitečné hlavně pro část obrazovky, která se při vyplňování zbytku obrazovky neposouvá, například záhlaví v horní části nebo stavovém řádku v dolní části aplikace.

Pro DECSTBM existují dva volitelné parametry, <t> a <b>, které slouží k určení řádků, které představují horní a dolní řádky oblasti posouvání včetně. Pokud jsou parametry vynechány, <výchozí hodnota t> je 1 a <b> výchozí hodnota aktuální výšky oblasti zobrazení.

Posuvné okraje jsou pro vyrovnávací paměť, proto je důležité, že alternativní vyrovnávací paměť a hlavní vyrovnávací paměť udržují samostatná nastavení posuvných okrajů (takže aplikace na celé obrazovce v alternativní vyrovnávací paměti neotráví okraje hlavní vyrovnávací paměti).

Sekvence Code Popis Chování
ESC [ <t> ; <b r> DECSTBM Nastavení oblasti posouvání Nastaví okraje posouvání VT oblasti zobrazení.

Název okna

Následující příkazy umožňují aplikaci nastavit název okna konzoly na daný <parametr řetězce> . Aby byl řetězec přijat, musí být kratší než 255 znaků. To je ekvivalent volání SetConsoleTitle s daným řetězcem.

Všimněte si, že tyto sekvence jsou posloupnosti OSC "Příkaz operačního systému" a ne csI, jako je řada ostatních uvedených sekvencí, a jako například začíná na "\x1b]", nikoli "\x1b[". Jako sekvence OSC jsou ukončeny řetězcovým ukončovacím znakem reprezentovaným jako <ST> a přenášeny (ESC \0x1B 0x5C). BEL (0x7) lze místo toho použít jako ukončovací znak, ale delší forma je upřednostňovaná.

Sekvence Popis Chování
ESC ] 0 ; <řetězec><SV> Nastavit název okna Nastaví název okna konzoly na <řetězec>.
ESC ] 2 ; <řetězec><SV> Nastavit název okna Nastaví název okna konzoly na <řetězec>.

Ukončovací znak zde je znak "Bell", '\x07'

Alternativní vyrovnávací paměť obrazovky

*Aplikace ve stylu Nix často využívají alternativní vyrovnávací paměť obrazovky, aby mohly upravovat celý obsah vyrovnávací paměti, aniž by to mělo vliv na aplikaci, která je spustila. Alternativní vyrovnávací paměť je přesně rozměry okna bez jakékoli oblasti posunutí zpět.

V příkladu tohoto chování zvažte, kdy se virtuální počítač spustí z bashe. Vim použije k úpravě souboru celou část obrazovky a pak se vrátí do bashe, původní vyrovnávací paměť zůstane beze změny.

Sekvence Popis Chování
ESC [ ? 1 0 4 9 h Použít alternativní vyrovnávací paměť obrazovky Přepne do nové alternativní vyrovnávací paměti obrazovky.
ESC [ ? 1 0 4 9 l Použít vyrovnávací paměť hlavní obrazovky Přepne do hlavní vyrovnávací paměti.

Šířka okna

K řízení šířky okna konzoly lze použít následující sekvence. Přibližně odpovídají volání rozhraní API konzoly SetConsoleScreenBufferInfoEx pro nastavení šířky okna.

Sekvence Code Popis Chování
ESC [ ? 3 h DECCOLM Nastavit počet sloupců na 132 Nastaví šířku konzoly na šířku 132 sloupců.
ESC [ ? 3 l DECCOLM Nastavit počet sloupců na 80 Nastaví šířku konzoly na šířku 80 sloupců.

Obnovitelné resetování

Následující posloupnost lze použít k resetování určitých vlastností na výchozí hodnoty. Následující vlastnosti se resetují na následující výchozí hodnoty (uvedené jsou také sekvence, které řídí tyto vlastnosti):

  • Viditelnost kurzoru: viditelná (DECTEM)
  • Číselná klávesnice: Číselný režim (DECNKM)
  • Režim kláves kurzoru: Normální režim (DECCKM)
  • Horní a dolní okraje: Top=1, Bottom=Výška konzoly (DECSTBM)
  • Znaková sada: US ASCII
  • Verze grafiky: Výchozí/vypnutá (SGR)
  • Uložit stav kurzoru: Umístění domovské stránky (0,0) (DECSC)
Sekvence Code Popis Chování
ESC [ ! p DECSTR Obnovitelné resetování Obnovte některá nastavení terminálu na výchozí hodnoty.

Vstupní sekvence

Následující sekvence terminálu se vygenerují hostitelem konzoly ve vstupním datovém proudu, pokud je příznak ENABLE_VIRTUAL_TERMINAL_INPUT nastaven na popisovač vstupní vyrovnávací paměti pomocí příznaku SetConsoleMode.

Existují dva interní režimy, které řídí, které sekvence se generují pro dané vstupní klávesy, režim kláves kurzoru a režim klávesových kláves. Jsou popsány v části Změny režimu.

Kurzorové klávesy

Klíč Normální režim Režim aplikace
ŠIPKA NAHORU ESC [ A ESC O A
Šipka dolů ESC [ B ESC O B
Šipka vpravo ESC [ C ESC O C
Šipka vlevo ESC [ D ESC O D
Domovská stránka ESC [ H ESC O H
konec ESC [ F ESC O F

Pokud je navíc stisknutá klávesa Ctrl s některou z těchto kláves, vygenerují se místo toho následující sekvence bez ohledu na režim kláves kurzoru:

Klíč Libovolný režim
Ctrl +Šipka nahoru ESC [ 1 ; 5 A
Ctrl+Šipka dolů ESC [ 1 ; 5 B
Ctrl + šipka vpravo ESC [ 1 ; 5 C
Ctrl + šipka vlevo ESC [ 1 ; 5 D

Numpad a funkční klávesy

Klíč Sekvence
Klávesa Backspace 0x7f (DEL)
Pauza 0x1a (SUB)
Útěk 0x1b (ESC)
Vložit ESC [ 2 ~
Vymazat ESC [ 3 ~
Stránka nahoru ESC [ 5 ~
Stránka dolů ESC [ 6 ~
Formule 1 ESC O P
F2 ESC O Q
F3 ESC O R
F4 ESC O S
F5 ESC [ 1 5 ~
F6 ESC [ 1 7 ~
F7 ESC [ 1 8 ~
F8 ESC [ 1 9 ~
F9 ESC [ 2 0 ~
F10 ESC [ 2 1 ~
F11 ESC [ 2 3 ~
F12 ESC [ 2 4 ~

Modifikátory

Alt je považován za předponu sekvence řídicím znakem: ESC <c, kde <c>> je znak předaný operačním systémem. Alt+Ctrl se zpracovává stejným způsobem, s výjimkou toho, že operační systém bude mít předsunutou <klávesu c> na příslušný řídicí znak, který bude předán aplikaci.

Kombinace kláves Ctrl se obvykle předává přesně tak, jak je přijímány ze systému. Obvykle se jedná o jeden znak posunutý dolů do vyhrazeného prostoru řídicího znaku (0x0-0x1f). Například ctrl+@ (0x40) se změní na NUL (0x00), Ctrl+[ (0x5b) se změní na ESC (0x1b) atd. Několik kombinací kláves Ctrl se zpracovává speciálně podle následující tabulky:

Klíč Sekvence
Ctrl +mezerník 0x00 (NUL)
Ctrl +Šipka nahoru ESC [ 1 ; 5 A
Ctrl+Šipka dolů ESC [ 1 ; 5 B
Ctrl + šipka vpravo ESC [ 1 ; 5 C
Ctrl + šipka vlevo ESC [ 1 ; 5 D

Poznámka:

Levý ctrl + pravý alt je považován za AltGr. Když se oba zobrazí společně, odstraní se a hodnota Unicode znaku prezentovaného systémem se předá do cíle. Systém předem přeloží hodnoty AltGr podle aktuálního nastavení vstupu systému.

Ukázky

Příklad sekvencí terminálu SGR

Následující kód obsahuje několik příkladů formátování textu.

#include <stdio.h>
#include <wchar.h>
#include <windows.h>

int main()
{
    // Set output mode to handle virtual terminal sequences
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    if (hOut == INVALID_HANDLE_VALUE)
    {
        return GetLastError();
    }

    DWORD dwMode = 0;
    if (!GetConsoleMode(hOut, &dwMode))
    {
        return GetLastError();
    }

    dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
    if (!SetConsoleMode(hOut, dwMode))
    {
        return GetLastError();
    }

    // Try some Set Graphics Rendition (SGR) terminal escape sequences
    wprintf(L"\x1b[31mThis text has a red foreground using SGR.31.\r\n");
    wprintf(L"\x1b[1mThis text has a bright (bold) red foreground using SGR.1 to affect the previous color setting.\r\n");
    wprintf(L"\x1b[mThis text has returned to default colors using SGR.0 implicitly.\r\n");
    wprintf(L"\x1b[34;46mThis text shows the foreground and background change at the same time.\r\n");
    wprintf(L"\x1b[0mThis text has returned to default colors using SGR.0 explicitly.\r\n");
    wprintf(L"\x1b[31;32;33;34;35;36;101;102;103;104;105;106;107mThis text attempts to apply many colors in the same command. Note the colors are applied from left to right so only the right-most option of foreground cyan (SGR.36) and background bright white (SGR.107) is effective.\r\n");
    wprintf(L"\x1b[39mThis text has restored the foreground color only.\r\n");
    wprintf(L"\x1b[49mThis text has restored the background color only.\r\n");

    return 0;
}

Poznámka:

V předchozím příkladu je řetězec '\x1b[31m' implementace ESC [ <n> m s <n> 31.

Následující obrázek ukazuje výstup předchozího příkladu kódu.

výstup konzoly pomocí příkazu sgr

Příklad povolení zpracování virtuálního terminálu

Následující kód poskytuje příklad doporučeného způsobu povolení zpracování virtuálního terminálu pro aplikaci. Záměrem ukázky je předvést:

  1. Existující režim by měl být vždy načten prostřednictvím rutiny GetConsoleMode a analyzován před nastavením pomocí setConsoleMode.

  2. Kontrola, zda SetConsoleMode vrací 0 a GetLastError vrací ERROR_INVALID_PARAMETER je aktuální mechanismus, který určuje, kdy běží v systému nižší úrovně. Aplikace, která přijímá ERROR_INVALID_PARAMETER s jedním z novějších příznaků režimu konzoly v bitovém poli, by měla elegantně snížit chování a zkusit to znovu.

#include <stdio.h>
#include <wchar.h>
#include <windows.h>

int main()
{
    // Set output mode to handle virtual terminal sequences
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    if (hOut == INVALID_HANDLE_VALUE)
    {
        return false;
    }
    HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE);
    if (hIn == INVALID_HANDLE_VALUE)
    {
        return false;
    }

    DWORD dwOriginalOutMode = 0;
    DWORD dwOriginalInMode = 0;
    if (!GetConsoleMode(hOut, &dwOriginalOutMode))
    {
        return false;
    }
    if (!GetConsoleMode(hIn, &dwOriginalInMode))
    {
        return false;
    }

    DWORD dwRequestedOutModes = ENABLE_VIRTUAL_TERMINAL_PROCESSING | DISABLE_NEWLINE_AUTO_RETURN;
    DWORD dwRequestedInModes = ENABLE_VIRTUAL_TERMINAL_INPUT;

    DWORD dwOutMode = dwOriginalOutMode | dwRequestedOutModes;
    if (!SetConsoleMode(hOut, dwOutMode))
    {
        // we failed to set both modes, try to step down mode gracefully.
        dwRequestedOutModes = ENABLE_VIRTUAL_TERMINAL_PROCESSING;
        dwOutMode = dwOriginalOutMode | dwRequestedOutModes;
        if (!SetConsoleMode(hOut, dwOutMode))
        {
            // Failed to set any VT mode, can't do anything here.
            return -1;
        }
    }

    DWORD dwInMode = dwOriginalInMode | dwRequestedInModes;
    if (!SetConsoleMode(hIn, dwInMode))
    {
        // Failed to set VT input mode, can't do anything here.
        return -1;
    }

    return 0;
}

Příklad funkcí Select Anniversary Update

Následující příklad je určen jako robustnější příklad kódu s použitím různých řídicích sekvencí pro manipulaci s vyrovnávací pamětí s důrazem na funkce přidané v Anniversary Update pro Windows 10.

V tomto příkladu se používá alternativní vyrovnávací paměť obrazovky, manipulace se zarážkami tabulátoru, nastavení okrajů posouvání a změna znakové sady.

// System headers
#include <windows.h>

// Standard library C-style
#include <wchar.h>
#include <stdlib.h>
#include <stdio.h>

#define ESC "\x1b"
#define CSI "\x1b["

bool EnableVTMode()
{
    // Set output mode to handle virtual terminal sequences
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    if (hOut == INVALID_HANDLE_VALUE)
    {
        return false;
    }

    DWORD dwMode = 0;
    if (!GetConsoleMode(hOut, &dwMode))
    {
        return false;
    }

    dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
    if (!SetConsoleMode(hOut, dwMode))
    {
        return false;
    }
    return true;
}

void PrintVerticalBorder()
{
    printf(ESC "(0"); // Enter Line drawing mode
    printf(CSI "104;93m"); // bright yellow on bright blue
    printf("x"); // in line drawing mode, \x78 -> \u2502 "Vertical Bar"
    printf(CSI "0m"); // restore color
    printf(ESC "(B"); // exit line drawing mode
}

void PrintHorizontalBorder(COORD const Size, bool fIsTop)
{
    printf(ESC "(0"); // Enter Line drawing mode
    printf(CSI "104;93m"); // Make the border bright yellow on bright blue
    printf(fIsTop ? "l" : "m"); // print left corner 

    for (int i = 1; i < Size.X - 1; i++)
        printf("q"); // in line drawing mode, \x71 -> \u2500 "HORIZONTAL SCAN LINE-5"

    printf(fIsTop ? "k" : "j"); // print right corner
    printf(CSI "0m");
    printf(ESC "(B"); // exit line drawing mode
}

void PrintStatusLine(const char* const pszMessage, COORD const Size)
{
    printf(CSI "%d;1H", Size.Y);
    printf(CSI "K"); // clear the line
    printf(pszMessage);
}

int __cdecl wmain(int argc, WCHAR* argv[])
{
    argc; // unused
    argv; // unused
    //First, enable VT mode
    bool fSuccess = EnableVTMode();
    if (!fSuccess)
    {
        printf("Unable to enter VT processing mode. Quitting.\n");
        return -1;
    }
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    if (hOut == INVALID_HANDLE_VALUE)
    {
        printf("Couldn't get the console handle. Quitting.\n");
        return -1;
    }

    CONSOLE_SCREEN_BUFFER_INFO ScreenBufferInfo;
    GetConsoleScreenBufferInfo(hOut, &ScreenBufferInfo);
    COORD Size;
    Size.X = ScreenBufferInfo.srWindow.Right - ScreenBufferInfo.srWindow.Left + 1;
    Size.Y = ScreenBufferInfo.srWindow.Bottom - ScreenBufferInfo.srWindow.Top + 1;

    // Enter the alternate buffer
    printf(CSI "?1049h");

    // Clear screen, tab stops, set, stop at columns 16, 32
    printf(CSI "1;1H");
    printf(CSI "2J"); // Clear screen

    int iNumTabStops = 4; // (0, 20, 40, width)
    printf(CSI "3g"); // clear all tab stops
    printf(CSI "1;20H"); // Move to column 20
    printf(ESC "H"); // set a tab stop

    printf(CSI "1;40H"); // Move to column 40
    printf(ESC "H"); // set a tab stop

    // Set scrolling margins to 3, h-2
    printf(CSI "3;%dr", Size.Y - 2);
    int iNumLines = Size.Y - 4;

    printf(CSI "1;1H");
    printf(CSI "102;30m");
    printf("Windows 10 Anniversary Update - VT Example");
    printf(CSI "0m");

    // Print a top border - Yellow
    printf(CSI "2;1H");
    PrintHorizontalBorder(Size, true);

    // // Print a bottom border
    printf(CSI "%d;1H", Size.Y - 1);
    PrintHorizontalBorder(Size, false);

    wchar_t wch;

    // draw columns
    printf(CSI "3;1H");
    int line = 0;
    for (line = 0; line < iNumLines * iNumTabStops; line++)
    {
        PrintVerticalBorder();
        if (line + 1 != iNumLines * iNumTabStops) // don't advance to next line if this is the last line
            printf("\t"); // advance to next tab stop

    }

    PrintStatusLine("Press any key to see text printed between tab stops.", Size);
    wch = _getwch();

    // Fill columns with output
    printf(CSI "3;1H");
    for (line = 0; line < iNumLines; line++)
    {
        int tab = 0;
        for (tab = 0; tab < iNumTabStops - 1; tab++)
        {
            PrintVerticalBorder();
            printf("line=%d", line);
            printf("\t"); // advance to next tab stop
        }
        PrintVerticalBorder();// print border at right side
        if (line + 1 != iNumLines)
            printf("\t"); // advance to next tab stop, (on the next line)
    }

    PrintStatusLine("Press any key to demonstrate scroll margins", Size);
    wch = _getwch();

    printf(CSI "3;1H");
    for (line = 0; line < iNumLines * 2; line++)
    {
        printf(CSI "K"); // clear the line
        int tab = 0;
        for (tab = 0; tab < iNumTabStops - 1; tab++)
        {
            PrintVerticalBorder();
            printf("line=%d", line);
            printf("\t"); // advance to next tab stop
        }
        PrintVerticalBorder(); // print border at right side
        if (line + 1 != iNumLines * 2)
        {
            printf("\n"); //Advance to next line. If we're at the bottom of the margins, the text will scroll.
            printf("\r"); //return to first col in buffer
        }
    }

    PrintStatusLine("Press any key to exit", Size);
    wch = _getwch();

    // Exit the alternate buffer
    printf(CSI "?1049l");

}