Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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.
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:
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.
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");
}