Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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.
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:
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.
Kontrola, zda SetConsoleMode vrací
0a 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");
}