Konzol virtuális terminálsorozatai

A virtuális terminálütemezések olyan vezérlőkarakciók, amelyek szabályozhatják a kurzor mozgását, a konzol színét és más műveleteket a kimeneti streambe írva. A bemeneti adatfolyamon a kimeneti stream lekérdezési információsorozatára vagy a felhasználói bemenet kódolására is sor kerülhet, ha a megfelelő mód be van állítva.

Ezt a viselkedést a GetConsoleMode és a SetConsoleMode függvényekkel konfigurálhatja. A dokumentum végén megjelenik egy minta a virtuális terminál viselkedésének engedélyezésére javasolt módszerről.

A következő sorozatok viselkedése a VT100 és a származtatott terminálemulátortechnológiákon alapul, különösen az xterm terminálemulátoron. A terminálütemezésekről további információt itt és itt http://invisible-island.net/xterm/ctlseqs/ctlseqs.htmltalálhttp://vt100.net.

Kimeneti sorozatok

A következő terminálütemezéseket a konzol gazdagépe fogja el a kimeneti adatfolyamba írásakor, ha a ENABLE_VIRTUAL_TERMINAL_PROCESSING jelző a SetConsoleMode függvénnyel van beállítva a képernyőpuffer fogópontján. Vegye figyelembe, hogy a DISABLE_NEWLINE_AUTO_RETURN jelző más terminálemulátorok kurzorpozíciójának és görgetési viselkedésének emulálásában is hasznos lehet a sor utolsó oszlopához írt karakterekhez képest.

Egyszerű kurzor elhelyezése

Az alábbi leírásokban az ESC mindig a hexadecimális érték 0x1B. A terminálütemezésekben nem szabad szóközöket elhelyezni. Az egyes terminálütemezések tetszőleges karakter- vagy bájthelyzetben feloszthatók a WriteFile vagy a WriteConsole több szekvenciális hívására, de ajánlott a teljes sorozatot egy hívásba foglalni. A sorozatok gyakorlati felhasználására vonatkozó példát a jelen témakör végén talál.

Az alábbi táblázat egyszerű feloldósorozatokat ír le egyetlen műveleti paranccsal közvetlenül az ESC karakter után. Ezek a sorozatok nem rendelkeznek paraméterekkel, és azonnal érvénybe lépnek.

A táblázat összes parancsa általában egyenértékű a SetConsoleCursorPosition konzol API-jának meghívásával a kurzor elhelyezéséhez.

A kurzor mozgatása az aktuális nézetport által a pufferbe lesz kötve. A görgetés (ha elérhető) nem történik meg.

Szekvencia Gyorsírás Magatartás
ESC M fenntartott példány Fordított index – Végrehajtja a \nfordított műveletét, felfelé mozgatja a kurzort egy vonallal, megtartja a vízszintes pozíciót, szükség esetén görgeti a puffert*
ESC 7 DECSC Kurzor pozíciójának mentése a memóriában**
ESC 8 DECSR Kurzor pozíciójának visszaállítása a memóriából**

Megjegyzés:

* Ha vannak görgetési margók meg, RI belül a margók görgetni csak a tartalmát a margók, és hagyja változatlanul a nézetportot. (Lásd: Görgető margók)

**A mentési parancs első használatáig nem lesz mentve érték a memóriába. A mentett érték elérésének egyetlen módja a visszaállítási parancs.

Kurzor elhelyezése

Az alábbi táblázatok a Control Sequence Introducer (CSI) típusütemezéseket foglalják magukban. Minden CSI-sorozat ESC-vel (0x1B) kezdődik, amelyet [ (bal oldali zárójel, 0x5B) követ, és változó hosszúságú paramétereket tartalmazhat az egyes műveletek további információinak megadásához. Ezt a rövidített <n> jelöli. Az alábbi táblázatokat funkciók szerint csoportosítjuk, és az egyes táblák alatti jegyzetek ismertetik a csoport működését.

Az összes paraméterre a következő szabályok vonatkoznak, kivéve, ha másként fel van jegyezve:

  • <n> az áthelyezni kívánt távolságot jelöli, és opcionális paraméter
  • Ha <n> nincs megadva, vagy értéke 0, akkor a rendszer 1-ként kezeli
  • <n> nem lehet nagyobb 32 767-nél (maximális rövid érték)
  • <n> nem lehet negatív

A szakasz összes parancsa általában egyenértékű a SetConsoleCursorPosition konzol API meghívásával.

A kurzor mozgatása az aktuális nézetport által a pufferbe lesz kötve. A görgetés (ha elérhető) nem történik meg.

Szekvencia Kód Leírás Magatartás
ESC [ <n> A CUU Kurzor felfelé Kurzor felfelé n szerint <>
ESC [ <n> B Felkérődzött táplálék Kurzor lefelé Kurzor lefelé n szerint <>
ESC [ <n> C CUF Kurzor előre Kurzor előre (jobbra) n <>
ESC [ <n> D KÖLYÖK Kurzor hátrafelé Kurzor hátrafelé (balra) n <>
ESC [ <n> E CNL Kurzor következő sora Kurzor lefelé <n> vonallal az aktuális pozícióból
ESC [ <n> F CPL Kurzor előző sora Kurzor felfelé <n> vonallal az aktuális pozícióból
ESC [ <n> G CHA Kurzor vízszintes abszolút A kurzor az <aktuális sorban vízszintesen az n>. helyre kerül
ESC [ <n> d VPA Függőleges vonal pozíciója abszolút A kurzor az <aktuális oszlopban függőlegesen az n>. pozícióba kerül
ESC [ <y> ; <x> H CSÉSZE Kurzor pozíciója *A kurzor x>;<<y> koordináta a nézetporton belül, ahol <x> az <y> sor oszlopa
ESC [ <y> ; <x> f HVP Vízszintes függőleges pozíció *A kurzor x>;<<y> koordináta a nézetporton belül, ahol <x> az <y> sor oszlopa
ESC [ s ANSISYSSC Kurzor mentése – Ansi.sys emuláció **Paraméterek nélkül végrehajt egy mentési kurzorműveletet, például a DECSC-t
ESC [ u ANSISYSRC Kurzor visszaállítása – Ansi.sys emuláció **Paraméterek nélkül hajt végre visszaállítási kurzorműveletet, például DECRC

Megjegyzés:

*<Az x> és <az y> paraméterekre ugyanazok a korlátozások vonatkoznak, mint <az n> fentebb. Ha <az x> és <az y> érték nincs megadva, az 1;1 értékre lesznek állítva.

**ANSI.sys előzménydokumentáció itt https://msdn.microsoft.com/library/cc722862.aspx található, és a kényelem/kompatibilitás érdekében implementálható.

Kurzor láthatósága

Az alábbi parancsok a kurzor láthatóságát és villogó állapotát szabályozzák. A DECTCEM-sorozatok általában egyenértékűek a SetConsoleCursorInfo konzol API meghívásával a kurzor láthatóságának váltásához.

Szekvencia Kód Leírás Magatartás
ESC [ ? 12 óra ATT160 Szövegkurzor – Villogás engedélyezése A kurzor villogásának indítása
ESC [ ? 12 l ATT160 Szövegkurzor – Villogás letiltása A kurzor villogásának leállítása
ESC [ ? 25 óra DECTCEM Szövegkurzor – Mód megjelenítése A kurzor megjelenítése
ESC [ ? 25 l DECTCEM Szövegkurzor – Mód elrejtése A kurzor elrejtése

Jótanács

Az engedélyezési sorozatok kis H karakterrel (h) végződnek, a letiltott sorozatok pedig kis L karakterrel (l) végződnek.

Kurzor alakzata

Az alábbi parancsok szabályozzák és engedélyezik a kurzor alakzat testreszabását.

Szekvencia Kód Leírás Magatartás
ESC [ 0 SP q DECSCUSR Felhasználói alakzat A felhasználó által konfigurált alapértelmezett kurzoralakzat
ESC [ 1 SP q DECSCUSR Villogó blokk Villogó blokk kurzor alakzata
ESC [ 2 SP q DECSCUSR Állandó blokk Állandó blokk kurzor alakzata
ESC [ 3 SP q DECSCUSR Villogó aláhúzás Villogó aláhúzott kurzoralakzat
ESC [ 4 SP q DECSCUSR Állandó aláhúzás Állandó aláhúzású kurzoralakzat
ESC [ 5 SP q DECSCUSR Villogó sáv Villogó sáv kurzoralakzata
ESC [ 6 SP q DECSCUSR Állandó sáv Állandó sáv kurzoralakzata

Megjegyzés:

SP egy konstans szóköz karakter (0x20) a köztes pozícióban, és az utolsó pozícióban (0x71) követi q .

Nézetport elhelyezése

A szakasz összes parancsa általában egyenértékű a ScrollConsoleScreenBuffer konzol API meghívásával a konzolpuffer tartalmának áthelyezéséhez.

Figyelmeztet A parancsnevek félrevezetőek. A görgetés arra utal, hogy a szöveg milyen irányban mozog a művelet során, és nem azt, hogy a nézet melyik irányban mozogna.

Szekvencia Kód Leírás Magatartás
ESC [ <n> S TE Görgetés felfelé Szöveg görgetése felfelé n> szerint<. Más néven pásztázás lefelé, új vonalak kitöltése a képernyő aljáról
ESC [ <n> T SD Görgetés lefelé Görgessen lefelé n> szerint<. Más néven pásztázás, új vonalak kitöltése a képernyő tetejéről

A szöveg a kurzor által bekapcsolva lévő vonallal kezdődik. Ha a kurzor a nézetport középső sorában van, akkor a felfelé görgetéssel áthelyezheti a nézetport alsó felét, és üres sorokat szúrhat be alul. A lefelé görgetéssel áthelyezheti a nézetport sorainak felső felét, és új sorokat szúrhat be felül.

Azt is fontos megjegyezni, hogy a görgetés felfelé és lefelé is hatással van a görgetési margókra. A felfelé és lefelé görgetés nem befolyásolja a görgetési margókon kívüli vonalakat.

Az n> alapértelmezett értéke <1, és az érték opcionálisan kihagyható.

Szöveg módosítása

A szakasz összes parancsa általában egyenértékű a FillConsoleOutputCharacter, a FillConsoleOutputAttribute és a ScrollConsoleScreenBuffer konzol API-k meghívásával a szövegpuffer tartalmának módosításához.

Szekvencia Kód Leírás Magatartás
ESC [ <n> @ ICH Karakter beszúrása Szúrjon be <n> szóközöket az aktuális kurzor pozíciójába, és helyezze az összes meglévő szöveget jobbra. A képernyőről jobbra kilépő szöveg el lesz távolítva.
ESC [ <n> P DCH Karakter törlése Törölje <az n> karaktereket a kurzor aktuális pozíciójában, és a képernyő jobb széléről szóköz karakterekre vált.
ESC [ <n> X ECH Karakter törlése Az n> karakterek törlése <a kurzor aktuális pozíciójából szóköz karakterrel való felülírásával.
ESC [ <n> L IL Sor beszúrása N sorokat <> szúr be a kurzor pozíciójában lévő pufferbe. A kurzor vonala be van kapcsolva, és az alatta lévő vonalak lefelé lesznek tolva.
ESC [ <n> M DL Sor törlése <Törli az n> sorokat a pufferből, kezdve azzal a sortal, amelyen a kurzor be van kapcsolva.

Megjegyzés:

Az IL és a DL esetében csak a görgető margók vonalai (lásd a görgetési margókat) érintik. Ha nincsenek beállítva margók, az alapértelmezett margószegélyek az aktuális nézetport. Ha a vonalak a margók alá kerülnek, a program elveti őket. A sorok törlésekor a program üres sorokat szúr be a margók alján, a nézetablakon kívüli sorokat nem érinti.

Az egyes sorozatok esetében az n> alapértelmezett értéke<, ha nincs megadva, 0.

Az alábbi parancsok esetében az n> paraméter <3 érvényes értékkel rendelkezik:

  • 0 törli a kurzor aktuális pozícióját (beleértve) a vonal/kijelző végéig
  • 1 a sor elejéről törli/megjeleníti az aktuális kurzor pozícióját
  • 2 törli a teljes sort/megjelenítést
Szekvencia Kód Leírás Magatartás
ESC [ <n> J ED Törlés megjelenítésben Az n> által <megadott jelenlegi nézet/képernyő összes szövegének cseréje szóköz karakterekkel
ESC [ <n> K EL Törlés sorba Cserélje le a sor összes szövegét az n> által <megadott kurzorra szóköz karakterekkel

Szövegformázás

A szakasz összes parancsa általában egyenértékű a SetConsoleTextAttribute konzol API-k meghívásával, hogy az összes jövőbeli írás formázását a konzol kimeneti szövegpufferéhez igazítsa.

Ez a parancs abban különleges, hogy az <alábbi n> pozíció 0 és 16 paraméter közötti, pontosvesszővel elválasztott paramétereket fogad el.

Ha nincsenek megadva paraméterek, a rendszer ugyanazt kezeli, mint egyetlen 0 paramétert.

Szekvencia Kód Leírás Magatartás
ESC [ <n> m SGR Grafikus megjelenítés beállítása A képernyő és a szöveg formátumának beállítása az n által megadott módon <>

Az alábbi értéktáblázat az n-ben <> használható különböző formázási módok megjelenítésére.

A formázási módok balról jobbra vannak alkalmazva. A versengő formázási beállítások alkalmazása a jobb szélső beállítást fogja elsőbbséget élvezni.

A színeket meghatározó beállítások esetében a rendszer a konzol színtáblájában meghatározott módon használja a színeket, amelyek a SetConsoleScreenBufferInfoEx API-val módosíthatók. Ha a táblázat úgy van módosítva, hogy a "kék" pozíció piros RGB-árnyalatot jelenítsen meg, akkor az Előtérkékre irányuló összes hívás ezt a piros színt jeleníti meg, amíg másként nem változik.

Érték Leírás Magatartás
0 Alapértelmezett Az összes attribútumot az alapértelmezett állapotnak adja vissza a módosítás előtt
1 Félkövér/világos Fényerő-/intenzitásjelző alkalmazása az előtérszínre
22 Nincs félkövér/világos Eltávolítja a fényerő/intenzitás jelzőt az előtérben lévő színről
4 Aláhúzás Aláhúzás hozzáadása
24 Nincs aláhúzás Aláhúzás eltávolítása
7 Negatív Előtér- és háttérszínek felcserélése
27 Pozitív (Nincs negatív) Az előtérbet/hátteret a normál értékre adja vissza
30 Előtér fekete Nem félkövér/világos fekete szín alkalmazása az előtérben
31 Előtér piros Nem félkövér/élénkvörös szín alkalmazása az előtérben
32 Előtérben zöld Nem félkövér/világoszöld szín alkalmazása az előtérben
33 Előtér sárga Nem félkövér/világos sárga szín alkalmazása az előtérben
34 Előtérben kék Nem félkövér/világoskék szín alkalmazása az előtérben
35 Előtérbeli Magenta Nem félkövér/világos magenta alkalmazása az előtérben
36 Előtérben cián Nem félkövér/világos cián alkalmazása az előtérben
37 Előtérben fehér Nem félkövér/világos fehér szín alkalmazása az előtérben
38 Előtér – bővített Kiterjesztett színérték alkalmazása az előtérben (lásd az alábbi részleteket)
39 Előtérben alapértelmezett Csak az alapértelmezett értékek előtérrészét alkalmazza (lásd: 0)
40 Fekete háttér Nem félkövér/világos fekete szín alkalmazása a háttérre
41 Háttér piros Nem félkövér/élénkvörös szín alkalmazása a háttérre
42 Háttér zöld Nem félkövér/világoszöld szín alkalmazása a háttérre
43 Háttér sárga Nem félkövér/világossárga szín alkalmazása a háttérre
44 Háttér kék Nem félkövér/világoskék szín alkalmazása a háttérre
45 Háttér-magenta Nem félkövér/világos magenta alkalmazása a háttérre
46 Háttér cián Nem félkövér/világos ciánt alkalmaz a háttérre
47 Háttér fehér Nem félkövér/világos fehér szín alkalmazása a háttérre
48 Háttér – bővített Kiterjesztett színértéket alkalmaz a háttérre (lásd az alábbi részleteket)
49 Háttér alapértelmezett beállítása Csak az alapértelmezett háttérrészt alkalmazza (lásd: 0)
90 Világos előtér fekete Félkövér/világos fekete szín alkalmazása az előtérben
91 Világos előtér piros Félkövér/élénkvörös szín alkalmazása az előtérben
92 Világos előtérben zöld Félkövér/világoszöld szín alkalmazása az előtérben
93 Világos előtér sárga Félkövér/világos sárga szín alkalmazása az előtérben
94 Világos előtérben kék Félkövér/világoskék szín alkalmazása az előtérben
95 Fényes előtér magenta Félkövér/világos magenta alkalmazása az előtérben
96 Fényes előtér cián Félkövér/világos cián alkalmazása az előtérben
97 Világos előtér fehér Félkövér/világos fehér szín alkalmazása az előtérben
100 Világos háttér fekete Félkövér/világos fekete szín alkalmazása a háttérre
101 Világos háttér piros Félkövér/élénkvörös szín alkalmazása a háttérre
102 Világos háttér zöld Félkövér/világoszöld szín alkalmazása a háttérre
103 Világos háttér sárga Félkövér/világossárga szín alkalmazása a háttérre
104 Világos háttér kék Félkövér/világoskék szín alkalmazása a háttérre
105 Világos háttér magenta Félkövér/világos magenta alkalmazása a háttérre
106 Világos háttér cián Félkövér/világos cián alkalmazása a háttérre
107 Világos háttér fehér Félkövér/világosfehér szín alkalmazása a háttérre

Bővített színek

Egyes virtuális terminálemulátorok támogatják a Windows Konzol által biztosított 16 színnél nagyobb színpalettát. Ezekhez a kiterjesztett színekhez a Windows Konzol a legközelebbi megfelelő színt választja ki a meglévő 16 színtáblából a megjelenítéshez. A fenti tipikus SGR-értékekkel ellentétben a kiterjesztett értékek az alábbi táblázatnak megfelelően további paramétereket használnak fel a kezdeti jelző után.

SGR Subsequence Leírás
38 ; 2 ; <r> ; <g> ; <b> Az előtérszín beállítása r, g>, <<b> paraméterekben>< megadott RGB értékre*
48 ; 2 ; <r> ; <g> ; <b> Háttérszín beállítása r, g>, <<b> paraméterekben>< megadott RGB értékre*
38 ; 5 ; <s> Az előtérszín beállítása indexelésre <> 88 vagy 256 színtáblában*
48 ; 5 ; <s> Háttérszín beállítása indexelésre <> 88 vagy 256 színtáblában*

*A belső összehasonlításhoz fenntartott 88 és 256 színpaletta az xterm terminálemulátoron alapul. Az összehasonlító/kerekítő táblák jelenleg nem módosíthatók.

Képernyőszínek

Az alábbi parancs lehetővé teszi, hogy az alkalmazás bármilyen RGB értékre állítsa a képernyőszínek palettáját.

Az RGB-értékeknek hexadecimális értékeknek kell lenniük az és , között0, és el kell különíteni az előre-perjel karakter (pl. rgb:1/24/86).ff

Vegye figyelembe, hogy ez a sorozat egy OSC "operációsrendszer-parancs" sorozat, és nem egy CSI, mint sok más felsorolt sorozat, és mint ilyen kezdődik "\x1b]", nem "\x1b[". OSC-szekvenciákként egy sztring terminátorsal végződnek, amely a (0x1B 0x5C) jellel ESC \ jelenik meg <ST> és továbbítható. BEL (0x7) használható inkább terminátorként, de a hosszabb formát részesíti előnyben.

Szekvencia Leírás Magatartás
ESC ] 4 ; <i> ; rgb : <r> / <g> / <b><ST> Képernyőszínek módosítása Az i. képernyőszínpalettaindex <beállítása az r>, g>, <<b értékben <megadott RGB értékekre>>

Módmódosítások

Ezek a bemeneti módokat vezérlő sorozatok. A beviteli módoknak két különböző halmaza van: a Kurzorbillentyűk mód és a Billentyűzetbillentyűk mód. A Kurzorbillentyűk mód a nyílbillentyűk, valamint a Kezdőlap és a Vég billentyűk által kibocsátott sorozatokat vezérli, míg a Billentyűzetbillentyűk mód elsősorban a számbillentyűzeten lévő billentyűk által kibocsátott sorozatokat, valamint a függvénykulcsokat vezérli.

Ezek a módok egyszerű logikai beállítások – a Kurzorbillentyűk mód normál (alapértelmezett) vagy alkalmazás, a billentyűzetbillentyűk üzemmódja pedig numerikus (alapértelmezett) vagy alkalmazás.

A kurzorbillentyűk és a Numpad > függvénykulcsok szakaszában megtekintheti az ezekben a módokban kibocsátott sorozatokat.

Szekvencia Kód Leírás Magatartás
ESC = DECKPAM Billentyűzet alkalmazásmód engedélyezése A billentyűzetbillentyűk alkalmazásmód-sorozatokat bocsátanak ki.
ESC > DECKPNM Billentyűzet numerikus mód engedélyezése A billentyűzetbillentyűk numerikus módú sorozatokat bocsátanak ki.
ESC [ ? 1 óra DECCKM Kurzorbillentyűk alkalmazásmód engedélyezése A billentyűzetbillentyűk alkalmazásmód-sorozatokat bocsátanak ki.
ESC [ ? 1 l DECCKM Kurzorbillentyűk alkalmazásmód letiltása (normál mód használata) A billentyűzetbillentyűk numerikus módú sorozatokat bocsátanak ki.

Lekérdezés állapota

Az ebben a szakaszban található összes parancs általában egyenértékű a Get* konzol API-k meghívásával az aktuális konzol pufferállapotával kapcsolatos állapotinformációk lekéréséhez.

Megjegyzés:

Ezek a lekérdezések közvetlenül azután bocsátják ki válaszaikat a konzol bemeneti adatfolyamába, hogy felismerték a kimeneti adatfolyamon, miközben ENABLE_VIRTUAL_TERMINAL_PROCESSING be van állítva. A ENABLE_VIRTUAL_TERMINAL_INPUT jelző nem vonatkozik a lekérdezési parancsokra, mivel feltételezzük, hogy a lekérdezést készítő alkalmazás mindig meg szeretné kapni a választ.

Szekvencia Kód Leírás Magatartás
ESC [ 6 n DECXCPR Jelentéskurzor pozíciója A kurzor pozíciójának kibocsátása: ESC [ <r> ; <c> R Where <r> = kurzorsor és <c> = kurzoroszlop
ESC [ 0 c DA Eszközattribútumok Jelentse a terminálidentitást. "\x1b[?1; 0c", amely a "VT101 with No Options" (VT101 with No Options) értéket jelöli.

Lapfülek

Míg a Windows konzol hagyományosan azt várja, hogy a lapok csak nyolc karakter szélesek legyenek, a *nix-alkalmazások bizonyos sorozatokat használva módosíthatják, hogy hol találhatók a tabulátorok a konzolablakokban, hogy optimalizálják a kurzor mozgását az alkalmazás számára.

Az alábbi sorozatok lehetővé teszik, hogy egy alkalmazás beállítsa a tabulátorhelyeket a konzolablakban, eltávolítsa őket, és navigáljon közöttük.

Szekvencia Kód Leírás Magatartás
ESC H HTS Vízszintes tabulátorkészlet Tabulátor beállítása az aktuális oszlopban, amelyben a kurzor található.
ESC [ <n> I CHT Kurzor vízszintes (előre) lapja Helyezze a kurzort a következő oszlopra (ugyanabban a sorban) egy tabulátorral. Ha nincs több tabulátor, lépjen a sor utolsó oszlopára. Ha a kurzor az utolsó oszlopban van, lépjen a következő sor első oszlopára.
ESC [ <n> Z CBT Kurzor hátrafelé lap Vigye a kurzort az előző oszlopba (ugyanabban a sorban) egy tabulátorral. Ha nincs több tabulátor, helyezze a kurzort az első oszlopra. Ha a kurzor az első oszlopban van, nem helyezi át a kurzort.
ESC [ 0 g TBC TabUlátor törlése (aktuális oszlop) Törli a tabulátort az aktuális oszlopból, ha van ilyen. Ellenkező esetben nem tesz semmit.
ESC [ 3 g TBC TabUlátor törlése (minden oszlop) Törli az összes jelenleg beállított tabulátort.
  • Mind a CHT, mind a CBT esetében az n> paraméter (default=1) azt jelzi, <hogy hányszor kell a kurzort a megadott irányba haladni.
  • Ha nincsenek beállítva tabulátorok a HTS-en keresztül, a CHT és a CBT az ablak első és utolsó oszlopát csak két tabulátorként kezeli.
  • Ha a HTS-sel tabulátort állít be, a konzol a TAB (0x09, \t) karakter kimenetén a következő tabulátorra lép, ugyanúgy, mint a CHT.

Karakterkészlet kijelölése

Az alábbi sorozatok lehetővé teszik, hogy a program módosítsa az aktív karakterkészlet-leképezést. Ez lehetővé teszi, hogy a program 7 bites ASCII-karaktereket bocsátson ki, de ezeket más karakterként jelenítse meg a terminálképernyőn. Jelenleg az egyetlen két támogatott karakterkészlet az ASCII (alapértelmezett) és a DEC Speciális grafikus karakterkészlet. Tekintse meg http://vt100.net/docs/vt220-rm/table2-4.html a DEC speciális grafikus karakterkészlet által képviselt összes karakter listáját.

Szekvencia Leírás Magatartás
ESC ( 0 Karakterkészlet kijelölése – DEC vonalrajz DEC vonal rajzolási mód engedélyezése
ESC ( B Karakterkészlet kijelölése – US ASCII ASCII mód engedélyezése (alapértelmezett)

Nevezetesen a DEC vonal rajzolási módot használják a konzolalkalmazások szegélyeinek rajzolásához. Az alábbi táblázat azt mutatja be, hogy az ASCII-karakterek milyen vonalrajz karakterre képeznek le.

Átok ASCII DEC vonalas rajz
0x6a j
0x6b k
0x6c l
0x6d m
0x6e n
0x71 q
0x74 t
0x75 u
0x76 v
0x77 w
0x78 x

Görgető margók

Az alábbi sorozatok lehetővé teszik, hogy a program konfigurálja a görgetési műveletek által érintett képernyő "görgetési régióját". Ez azoknak a soroknak a részhalmaza, amelyek akkor vannak beállítva, ha a képernyő egyébként görgetne, például egy "\n" vagy egy RI-n. Ezek a margók a Sor beszúrása (IL) és a Sor törlése (DL), a Felfelé görgetés (SU) és a Lefelé görgetés (SD) által módosított sorokat is érintik.

A görgetési margók különösen hasznosak lehetnek, ha a képernyő egy része nem görget, amikor a képernyő többi része megtelik, például egy címsor a tetején vagy egy állapotsor az alkalmazás alján.

A DECSTBM-hez két választható paraméter létezik: <t> és <b>, amelyek a görgetési régió felső és alsó sorait ábrázoló sorok megadására szolgálnak, beleértve azokat is. Ha a paraméterek nincsenek megadva, a t> alapértelmezés szerint 1, <a <b> pedig az aktuális nézetportmagasság.

A görgető margók pufferenként vannak, ezért fontos, hogy az alternatív puffer és a fő puffer külön görgetési margóbeállításokat tartson fenn (így a másodlagos puffer teljes képernyős alkalmazása nem fogja megmérgezni a fő puffer margóit).

Szekvencia Kód Leírás Magatartás
ESC [ <t> ; <b> r DECSTBM Görgetési régió beállítása A nézetport VT görgetési margóit állítja be.

Ablak címe

Az alábbi parancsok lehetővé teszik, hogy az alkalmazás a konzolablak címét a megadott <sztringparaméterre> állítsa. A sztringnek 255 karakternél rövidebbnek kell lennie az elfogadáshoz. Ez egyenértékű a SetConsoleTitle meghívásával a megadott sztringgel.

Vegye figyelembe, hogy ezek a szekvenciák OSC "operációsrendszer-parancs" sorozatok, és nem csi-k, mint sok más felsorolt szekvenciák, és mint ilyen kezdődik "\x1b]", nem "\x1b[". OSC-szekvenciákként egy sztring terminátorsal végződnek, amely a (0x1B 0x5C) jellel ESC \ jelenik meg <ST> és továbbítható. BEL (0x7) használható inkább terminátorként, de a hosszabb formát részesíti előnyben.

Szekvencia Leírás Magatartás
ESC ] 0 ; <húr><SZT> Ablak címének beállítása A konzolablak címét sztringre <>állítja.
ESC ] 2 ; <húr><SZT> Ablak címének beállítása A konzolablak címét sztringre <>állítja.

A végződő karakter itt a "Bell" karakter, '\x07'

Másodlagos képernyőpuffer

*A Nix-stílusú alkalmazások gyakran használnak alternatív képernyőpuffert, hogy a puffer teljes tartalmát módosíthassák anélkül, hogy hatással lennének az őket elindító alkalmazásra. Az alternatív puffer pontosan az ablak méretei, görgetési régió nélkül.

Erre a viselkedésre példaként fontolja meg, hogy mikor indul el a vim a bashből. A Vim a teljes képernyőt használja a fájl szerkesztéséhez, majd a bashre való visszatérés változatlanul hagyja az eredeti puffert.

Szekvencia Leírás Magatartás
ESC [ ? 1 0 4 9 h Alternatív képernyőpuffer használata Váltás egy új alternatív képernyőpufferre.
ESC [ ? 1 0 4 9 l A főképernyő pufferének használata Váltás a fő pufferre.

Ablak szélessége

A következő sorozatokkal szabályozható a konzolablak szélessége. Nagyjából egyenértékűek a SetConsoleScreenBufferInfoEx konzol API meghívásával az ablak szélességének beállításához.

Szekvencia Kód Leírás Magatartás
ESC [ ? 3 óra DECCOLM Oszlopok számának beállítása 132 értékre A konzol szélességét 132 oszlop szélesre állítja.
ESC [ ? 3 l DECCOLM Oszlopok számának beállítása 80-ra A konzol szélességét 80 oszlop szélesre állítja.

Helyreállítható alaphelyzetbe állítás

Az alábbi sorozat bizonyos tulajdonságok alapértelmezett értékre állítására használható. A következő tulajdonságok a következő alapértelmezett értékekre lesznek visszaállítva (a tulajdonságokat vezérlő sorozatok is szerepelnek a listában):

  • Kurzor láthatósága: látható (DECTEM)
  • Numerikus billentyűzet: Numerikus mód (DECNKM)
  • Kurzorbillentyűk mód: Normál mód (DECCKM)
  • Felső és alsó margók: Top=1, Bottom=Konzol magassága (DECSTBM)
  • Karakterkészlet: US ASCII
  • Grafikus megjelenítés: Default/Off (SGR)
  • A kurzor mentési állapota: Kezdőlap pozíció (0,0) (DECSC)
Szekvencia Kód Leírás Magatartás
ESC [ ! p DECSTR Helyreállítható alaphelyzetbe állítás Bizonyos terminálbeállítások visszaállítása az alapértelmezett beállításokra.

Bemeneti sorozatok

A következő terminálütemezéseket a konzol gazdagépe bocsátja ki a bemeneti adatfolyamon, ha a ENABLE_VIRTUAL_TERMINAL_INPUT jelző a SetConsoleMode jelzővel van beállítva a bemeneti pufferfogóponton.

Két belső mód vezérli, hogy mely sorozatok bocsáthatók ki a megadott bemeneti kulcsokhoz, a Kurzorbillentyűk módhoz és a Billentyűzetbillentyűk módhoz. Ezeket a Módmódosítások szakaszban ismertetjük.

Kurzorbillentyűk

Billentyű Normál mód Alkalmazás mód
Fel nyíl ESC [ A ESC O A
Le nyíl ESC [ B ESC O B
Jobbra nyíl ESC [ C ESC O C
Balra nyíl ESC [ D ESC O D
kezdőlap ESC [ H ESC O H
Vége ESC [ F ESC O F

Ezenkívül ha a Ctrl billentyűt bármelyik billentyűvel lenyomja, a kurzorbillentyűk módtól függetlenül a következő sorozatok lesznek kibocsátva:

Billentyű Bármilyen mód
Ctrl + Fel nyíl ESC [ 1; 5 A
Ctrl + Le nyíl ESC [ 1 ; 5 B
Ctrl + Jobbra nyíl ESC [ 1 ; 5 C
Ctrl + Balra nyíl ESC [ 1 ; 5 D

Numpad > Függvénykulcsok

Billentyű Szekvencia
Visszalépés 0x7f (DEL)
Szünet 0x1a (SUB)
Menekülés 0x1b (ESC)
Beilleszt ESC [ 2 ~
Törlés ESC [ 3 ~
Oldal fel ESC [ 5 ~
Oldal lefelé ESC [ 6 ~
F1 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 ~

Módosítók

Az Alt előtaggal kezeli a sorozatot egy feloldójellel: ESC <c> , ahol <c> az operációs rendszer által átadott karakter. Az Alt+Ctrl billentyűkombinációt ugyanúgy kezeli a rendszer, kivéve, ha az operációs rendszer előre áthelyezi a <c> billentyűt a megfelelő vezérlő karakterre, amelyet továbbít az alkalmazásnak.

A Ctrl általában pontosan a rendszertől kapott módon van átadva. Ez általában egy karaktert vált le a vezérlőkarakter fenntartott területére (0x0-0x1f). A Ctrl+@ (0x40) például NUL (0x00), Ctrl+[ (0x5b) lesz ESC (0x1b) stb. Néhány Ctrl billentyűkombinációt kifejezetten az alábbi táblázat szerint kezelünk:

Billentyű Szekvencia
Ctrl + Szóköz 0x00 (NUL)
Ctrl + Fel nyíl ESC [ 1; 5 A
Ctrl + Le nyíl ESC [ 1 ; 5 B
Ctrl + Jobbra nyíl ESC [ 1 ; 5 C
Ctrl + Balra nyíl ESC [ 1 ; 5 D

Megjegyzés:

A bal oldali Ctrl +Jobbra alt billentyűkombinációt AltGr-ként kezeli a szolgáltatás. Ha mindkettő együtt látható, a rendszer eltávolítja őket, és a rendszer által bemutatott karakter Unicode-értéke bekerül a célba. A rendszer előre lefordítja az AltGr-értékeket a rendszer aktuális bemeneti beállításainak megfelelően.

Minták

Példa SGR-terminálütemezésekre

Az alábbi kód számos példát tartalmaz a szövegformázásra.

#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;
}

Megjegyzés:

Az előző példában a "\x1b[31m" sztring az ESC [<n> m<>] megvalósítása, n pedig 31.

Az alábbi ábra az előző kód példájának kimenetét mutatja be.

a konzol kimenete az sgr paranccsal

Példa a virtuális terminál feldolgozásának engedélyezésére

Az alábbi kód egy példa a virtuális terminálok alkalmazáshoz való feldolgozásának engedélyezésére javasolt módszerre. A minta célja a következő szemléltetés:

  1. A meglévő módot mindig a GetConsoleMode-on keresztül kell lekérni, és elemezni kell, mielőtt a SetConsoleMode-ra lenne beállítva.

  2. Annak ellenőrzése, hogy a SetConsoleMode visszatér-e 0 , és a GetLastError visszaadja-e a ERROR_INVALID_PARAMETER az aktuális mechanizmus, amely meghatározza, hogy egy alacsonyabb szintű rendszeren fut-e. A bitmező egyik újabb konzolmód-jelzőjével rendelkező ERROR_INVALID_PARAMETER fogadó alkalmazásnak kecsesen le kell rontania a viselkedést, és újra kell próbálkoznia.

#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élda az évforduló frissítési funkcióinak kiválasztására

Az alábbi példa egy robusztusabb példa a kódra, amely különböző feloldóütemezésekkel manipulálja a puffert, különös hangsúlyt fektetve a Windows 10 évfordulós frissítésében hozzáadott funkciókra.

Ez a példa az alternatív képernyőpuffert használja, módosítja a tabulátorokat, beállítja a görgető margókat, és módosítja a karakterkészletet.

// 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");

}