Bagikan melalui


Urutan Terminal Virtual Konsol

Urutan terminal virtual adalah urutan karakter kontrol yang dapat mengontrol gerakan kursor, warna konsol, dan operasi lainnya saat ditulis ke aliran output. Urutan juga dapat diterima pada aliran input sebagai respons terhadap urutan informasi kueri aliran output atau sebagai pengodean input pengguna saat mode yang sesuai diatur.

Anda dapat menggunakan fungsi GetConsoleMode dan SetConsoleMode untuk mengonfigurasi perilaku ini. Sampel cara yang disarankan untuk mengaktifkan perilaku terminal virtual disertakan di akhir dokumen ini.

Perilaku urutan berikut didasarkan pada teknologi emulator terminal VT100 dan turunan, paling khusus emulator terminal xterm. Informasi selengkapnya tentang urutan terminal dapat ditemukan di http://vt100.net dan di http://invisible-island.net/xterm/ctlseqs/ctlseqs.html.

Urutan Output

Urutan terminal berikut dicegat oleh host konsol saat ditulis ke dalam aliran output, jika bendera ENABLE_VIRTUAL_TERMINAL_PROCESSING diatur pada handel buffer layar menggunakan fungsi SetConsoleMode. Perhatikan bahwa bendera DISABLE_NEWLINE_AUTO_RETURN mungkin juga berguna dalam menimulasi posisi kursor dan perilaku gulir emulator terminal lain sehubungan dengan karakter yang ditulis ke kolom akhir di baris mana pun.

Penempatan Kursor Sederhana

Dalam semua deskripsi berikut, ESC selalu merupakan nilai heksadesimal 0x1B. Tidak ada spasi yang akan disertakan dalam urutan terminal. Urutan terminal individual dapat dibagi, pada karakter atau posisi byte apa pun, di beberapa panggilan berurutan ke WriteFile atau WriteConsole tetapi praktik terbaik adalah menyertakan seluruh urutan dalam satu panggilan. Untuk contoh bagaimana urutan ini digunakan dalam praktiknya, silakan lihat contoh di akhir topik ini.

Tabel berikut ini menjelaskan urutan escape sederhana dengan satu perintah tindakan langsung setelah karakter ESC. Urutan ini tidak memiliki parameter dan segera berlaku.

Semua perintah dalam tabel ini umumnya setara dengan memanggil API konsol SetConsoleCursorPosition untuk menempatkan kursor.

Gerakan kursor akan dibatasi oleh viewport saat ini ke dalam buffer. Pengguliran (jika tersedia) tidak akan terjadi.

Sequence Pintasan Perilaku
ESC M RI Indeks Terbalik – Melakukan operasi terbalik \n, memindahkan kursor ke atas satu baris, mempertahankan posisi horizontal, menggulir buffer jika perlu*
ESC 7 DECSC Simpan Posisi Kursor dalam Memori**
ESC 8 DECSR Pulihkan Posisi Kursor dari Memori**

Catatan

* Jika ada margin gulir yang diatur, RI di dalam margin hanya akan menggulir konten margin, dan membiarkan viewport tidak berubah. (Lihat Menggulir Margin)

**Tidak akan ada nilai yang disimpan dalam memori hingga penggunaan pertama perintah simpan. Satu-satunya cara untuk mengakses nilai yang disimpan adalah dengan perintah pemulihan.

Penempatan Kursor

Tabel berikut mencakup urutan jenis Control Sequence Introducer (CSI). Semua urutan CSI dimulai dengan ESC (0x1B) diikuti oleh [ (kurung kiri, 0x5B) dan mungkin berisi parameter panjang variabel untuk menentukan lebih banyak informasi untuk setiap operasi. Ini akan diwakili oleh shorthand <n>. Setiap tabel di bawah ini dikelompokkan menurut fungsionalitas dengan catatan di bawah setiap tabel yang menjelaskan cara kerja grup.

Untuk semua parameter, aturan berikut berlaku kecuali dinyatakan lain:

  • <n> mewakili jarak untuk dipindahkan dan merupakan parameter opsional
  • Jika <n> dihilangkan atau sama dengan 0, n akan diperlakukan sebagai 1
  • <n> tidak boleh lebih besar dari 32.767 (nilai pendek maksimum)
  • <n> tidak boleh negatif

Semua perintah di bagian ini umumnya setara dengan memanggil API konsol SetConsoleCursorPosition.

Gerakan kursor akan dibatasi oleh viewport saat ini ke dalam buffer. Pengguliran (jika tersedia) tidak akan terjadi.

Sequence Kode Deskripsi Perilaku
ESC [ <n> A CUU Kursor Ke Atas Kursor naik menurut <n>
ESC [ <n> B CUD Kursor Bawah Kursor turun menurut <n>
ESC [ <n> C CUF Penerusan Kursor Penerusan kursor (Kanan) menurut <n>
ESC [ <n> D CUB Kursor Mundur Kursor mundur (Kiri) menurut <n>
ESC [ <n> E CNL Kursor Baris Berikutnya Kursor ke bawah <n> baris dari posisi saat ini
ESC [ <n> F CPL Kursor Baris Sebelumnya Kursor ke atas <n> baris dari posisi saat ini
ESC [ <n> G CHA Absolut Horizontal Kursor Kursor berpindah ke <posisi ke-n>secara horizontal di baris saat ini
ESC [ <n> d VPA Absolut Posisi Garis Vertikal Kursor berpindah ke <posisi ke-n>secara vertikal di kolom saat ini
ESC [ <y> ; <x> H CUP Posisi Kursor *Kursor berpindah ke <x>; <koordinat y> dalam viewport, di mana <x> adalah kolom <baris y>
ESC [ <y> ; <x> f HVP Posisi Vertikal Horizontal *Kursor berpindah ke <x>; <koordinat y> dalam viewport, di mana <x> adalah kolom <baris y>
ESC [ s ANSISYSSC Simpan Kursor – emulasi Ansi.sys **Tanpa parameter, melakukan operasi simpan kursor seperti DECSC
ESC [ u ANSISYSRC Pulihkan Kursor – emulasi Ansi.sys **Tanpa parameter, melakukan operasi kursor pemulihan seperti DECRC

Catatan

Parameter *<x> dan <y> memiliki batasan yang sama dengan <n> di atas. Jika <x> dan <y> dihilangkan, mereka akan diatur ke 1;1.

**ANSI.sys dokumentasi historis dapat ditemukan di dan diimplementasikan https://msdn.microsoft.com/library/cc722862.aspx untuk kenyamanan/kompatibilitas.

Visibilitas Kursor

Perintah berikut mengontrol visibilitas kursor dan status berkedipnya. Urutan DECTCEM umumnya setara dengan memanggil API konsol SetConsoleCursorInfo untuk mengalihkan visibilitas kursor.

Sequence Kode Deskripsi Perilaku
ESC [ ? 12 j ATT160 Kursor Teks Aktifkan Berkedip Memulai kursor berkedip
ESC [ ? 12 l ATT160 Kursor Teks Nonaktifkan Berkedip Berhenti mengedipkan kursor
ESC [ ? 25 jam DECTCEM Mode Aktifkan Kursor Teks Ditampilkan Perlihatkan kursor
ESC [ ? 25 l DECTCEM Mode Aktifkan Kursor Teks Sembunyikan Sembunyikan kursor

Tip

Urutan aktifkan berakhiran karakter H huruf kecil (h) dan urutan nonaktifkan berakhiran karakter L huruf kecil (l).

Bentuk Kursor

Perintah berikut mengontrol dan memungkinkan penyesuaian bentuk kursor.

Sequence Kode Deskripsi Perilaku
ESC [ 0 SP q DECSCUSR Bentuk Pengguna Bentuk kursor default yang dikonfigurasi oleh pengguna
ESC [ 1 SP q DECSCUSR Blok Berkedip Bentuk kursor blok berkedip
ESC [ 2 SP q DECSCUSR Blok Stabil Bentuk kursor blok stabil
ESC [ 3 SP q DECSCUSR Garis Bawah Berkedip Mengedipkan bentuk kursor garis bawah
ESC [ 4 SP q DECSCUSR Garis Bawah Stabil Bentuk kursor garis bawah stabil
ESC [ 5 SP q DECSCUSR Bilah Berkedip Bentuk kursor bilah berkedip
ESC [ 6 SP q DECSCUSR Bilah Stabil Bentuk kursor batang stabil

Catatan

SP adalah karakter spasi harfiah (0x20) dalam posisi menengah, dan diikuti oleh q (0x71) di posisi akhir.

Viewport Positioning

Semua perintah di bagian ini umumnya setara dengan memanggil API konsol ScrollConsoleScreenBuffer untuk memindahkan konten buffer konsol.

Perhatian Nama perintah menyesatkan. Gulir merujuk ke arah mana teks bergerak selama operasi, bukan ke arah mana viewport akan terlihat bergerak.

Sequence Kode Deskripsi Perilaku
ESC [ <n> S SU Gulir Ke Atas Gulir teks ke atas dengan <n>. Juga dikenal sebagai geser ke bawah, baris baru mengisi dari bagian bawah layar
ESC [ <n> T SD Gulir ke Bawah Gulir ke bawah menurut <n>. Juga dikenal sebagai geser ke atas, baris baru mengisi dari bagian atas layar

Teks dipindahkan dimulai dengan garis tempat kursor aktif. Jika kursor berada di baris tengah viewport, maka gulir ke atas akan memindahkan bagian bawah viewport, dan menyisipkan baris kosong di bagian bawah. Gulir ke bawah akan memindahkan bagian atas baris viewport, dan menyisipkan baris baru di bagian atas.

Penting juga untuk dicatat adalah menggulir ke atas dan ke bawah juga dipengaruhi oleh margin gulir. Gulir ke atas dan ke bawah tidak akan memengaruhi garis apa pun di luar margin gulir.

Nilai default untuk <n> adalah 1, dan nilainya dapat dihilangkan secara opsional.

Modifikasi Teks

Semua perintah di bagian ini umumnya setara dengan memanggil API konsol FillConsoleOutputCharacter, FillConsoleOutputAttribute, dan ScrollConsoleScreenBuffer untuk memodifikasi konten buffer teks.

Sequence Kode Deskripsi Perilaku
ESC [ <n> @ ICH Sisipkan Karakter Sisipkan <n> spasi pada posisi kursor saat ini, menggeser semua teks yang ada ke kanan. Teks yang keluar dari layar di sebelah kanan dihapus.
ESC [ <n> P DCH Hapus Karakter Hapus <karakter n> pada posisi kursor saat ini, menggeser karakter spasi dari tepi kanan layar.
ESC [ <n> X ECH Hapus Karakter Hapus <n> karakter dari posisi kursor saat ini dengan menimpanya dengan karakter spasi.
ESC [ <n> L IL Sisipkan Garis <Menyisipkan n> baris ke dalam buffer pada posisi kursor. Garis tempat kursor menyala, dan garis di bawahnya, akan digeser ke bawah.
ESC [ <n> M DL Hapus Baris <Menghapus n> baris dari buffer, dimulai dengan baris tempat kursor aktif.

Catatan

Untuk IL dan DL, hanya baris di margin gulir (lihat Margin Gulir) yang terpengaruh. Jika tidak ada margin yang diatur, batas margin default adalah viewport saat ini. Jika garis akan digeser di bawah margin, garis tersebut akan dibuang. Ketika garis dihapus, baris kosong disisipkan di bagian bawah margin, garis dari luar viewport tidak pernah terpengaruh.

Untuk setiap urutan, nilai default untuk <n> jika dihilangkan adalah 0.

Untuk perintah berikut, parameter <n> memiliki 3 nilai yang valid:

  • 0 menghapus dari posisi kursor saat ini (inklusif) ke akhir baris/tampilan
  • 1 menghapus dari awal garis/tampilan hingga dan menyertakan posisi kursor saat ini
  • 2 menghapus seluruh baris/tampilan
Sequence Kode Deskripsi Perilaku
ESC [ <n> J ED Hapus dalam Tampilan Ganti semua teks dalam viewport/screen saat ini yang ditentukan oleh <n> dengan karakter spasi
ESC [ <n> K EL Hapus dalam Baris Ganti semua teks pada baris dengan kursor yang ditentukan oleh <n> dengan karakter spasi

Pemformatan Teks

Semua perintah di bagian ini umumnya setara dengan memanggil API konsol SetConsoleTextAttribute untuk menyesuaikan pemformatan semua penulisan di masa mendatang ke buffer teks output konsol.

Perintah ini khusus karena posisi n> di bawah ini dapat menerima antara 0 dan 16 parameter yang <dipisahkan oleh titik koma.

Ketika tidak ada parameter yang ditentukan, parameter diperlakukan sama dengan parameter 0 tunggal.

Sequence Kode Deskripsi Perilaku
ESC [ <n> m SGR Atur Rendisi Grafis Atur format layar dan teks seperti yang ditentukan oleh <n>

Tabel nilai berikut dapat digunakan dalam <n> untuk mewakili mode pemformatan yang berbeda.

Mode pemformatan diterapkan dari kiri ke kanan. Menerapkan opsi pemformatan yang bersaing akan menghasilkan opsi paling tepat yang diutamakan.

Untuk opsi yang menentukan warna, warna akan digunakan seperti yang didefinisikan dalam tabel warna konsol yang dapat dimodifikasi menggunakan API SetConsoleScreenBufferInfoEx. Jika tabel dimodifikasi untuk membuat posisi "biru" dalam tabel menampilkan bayangan RGB merah, maka semua panggilan ke Foreground Blue akan menampilkan warna merah itu sampai diubah sebaliknya.

Nilai Deskripsi Perilaku
0 Default Mengembalikan semua atribut ke status default sebelum modifikasi
1 Tebal/Cerah Menerapkan bendera kecerahan/intensitas ke warna latar depan
22 Tidak ada tebal/cerah Menghapus bendera kecerahan/intensitas dari warna latar depan
4 Garis Bawah Menambahkan garis bawah
24 Tidak ada garis bawah Menghapus garis bawah
7 Negatif Menukar warna latar depan dan latar belakang
27 Positif (Tidak ada negatif) Mengembalikan latar depan/latar belakang ke normal
30 Latar Depan Hitam Menerapkan hitam non-tebal/terang ke latar depan
31 Latar Depan Merah Menerapkan merah non-tebal/terang ke latar depan
32 Latar Depan Hijau Menerapkan hijau non-tebal/cerah ke latar depan
33 Latar Depan Kuning Menerapkan kuning non-tebal/cerah ke latar depan
34 Latar Depan Biru Menerapkan biru non-tebal/cerah ke latar depan
35 Latar depan Magenta Menerapkan magenta non-tebal/cerah ke latar depan
36 Cyan Latar Depan Menerapkan sian non-tebal/cerah ke latar depan
37 Latar Depan Putih Menerapkan putih non-tebal/cerah ke latar depan
38 Latar Depan Diperluas Menerapkan nilai warna yang diperluas ke latar depan (lihat detail di bawah)
39 Default Latar Depan Hanya menerapkan bagian latar depan default (lihat 0)
40 Latar Belakang Hitam Menerapkan hitam tidak tebal/terang ke latar belakang
41 Latar Belakang Merah Menerapkan merah non-tebal/terang ke latar belakang
42 Latar Belakang Hijau Menerapkan hijau non-tebal/cerah ke latar belakang
43 Latar Belakang Kuning Menerapkan kuning tidak tebal/cerah ke latar belakang
44 Latar Belakang Biru Menerapkan biru non-tebal/cerah ke latar belakang
45 Latar Belakang Magenta Menerapkan magenta non-tebal/cerah ke latar belakang
46 Bahasa Cyan Latar Belakang Menerapkan sian non-tebal/cerah ke latar belakang
47 Latar Belakang Putih Menerapkan putih tidak tebal/cerah ke latar belakang
48 Latar Belakang Diperluas Menerapkan nilai warna yang diperluas ke latar belakang (lihat detail di bawah)
49 Default Latar Belakang Hanya menerapkan bagian latar belakang default (lihat 0)
90 Latar Depan Hitam Cerah Menerapkan hitam tebal/terang ke latar depan
91 Merah Latar Depan Cerah Menerapkan merah tebal/terang ke latar depan
92 Hijau Latar Depan Cerah Menerapkan tebal/hijau cerah ke latar depan
93 Kuning Latar Depan Cerah Menerapkan kuning tebal/cerah ke latar depan
94 Biru Latar Depan Cerah Menerapkan biru tebal/cerah ke latar depan
95 Magenta Latar Depan Cerah Menerapkan magenta tebal/cerah ke latar depan
96 Cyan Latar Depan Cerah Menerapkan sian tebal/cerah ke latar depan
97 Putih Latar Depan Cerah Menerapkan tebal/putih cerah ke latar depan
100 Latar Belakang Hitam Cerah Menerapkan hitam tebal/terang ke latar belakang
101 Merah Latar Belakang Cerah Menerapkan tebal/merah cerah ke latar belakang
102 Hijau Latar Belakang Cerah Menerapkan tebal/hijau cerah ke latar belakang
103 Warna Kuning Latar Belakang Cerah Menerapkan kuning tebal/cerah ke latar belakang
104 Biru Latar Belakang Cerah Menerapkan biru tebal/cerah ke latar belakang
105 Magenta Latar Belakang Cerah Menerapkan magenta tebal/cerah ke latar belakang
106 Cyan Latar Belakang Cerah Menerapkan sian tebal/cerah ke latar belakang
107 Putih Latar Belakang Cerah Menerapkan tebal/putih cerah ke latar belakang

Warna yang Diperluas

Beberapa emulator terminal virtual mendukung palet warna yang lebih besar dari 16 warna yang disediakan oleh Konsol Windows. Untuk warna yang diperluas ini, Konsol Windows akan memilih warna terdekat yang sesuai dari tabel warna 16 yang ada untuk ditampilkan. Tidak seperti nilai SGR biasa di atas, nilai yang diperluas akan menggunakan parameter tambahan setelah indikator awal sesuai dengan tabel di bawah ini.

SGR Subsequence Deskripsi
38 ; 2 ; <r> ; <g> ; <B> Atur warna latar depan ke nilai RGB yang ditentukan dalam <parameter r>, <g>, <b> *
48 ; 2 ; <r> ; <g> ; <B> Atur warna latar belakang ke nilai RGB yang ditentukan dalam <parameter r>, <g>, <b> *
38 ; 5 ; <S> Atur warna latar depan ke <indeks s> dalam tabel warna 88 atau 256*
48 ; 5 ; <S> Atur warna latar belakang ke <indeks s> dalam tabel warna 88 atau 256*

*Palet warna 88 dan 256 dipertahankan secara internal untuk perbandingan didasarkan dari emulator terminal xterm. Tabel perbandingan/pembulatan tidak dapat diubah saat ini.

Warna Layar

Perintah berikut memungkinkan aplikasi untuk mengatur nilai palet warna layar ke nilai RGB apa pun.

Nilai RGB harus berupa nilai heksadesimal antara 0 dan ff, dan dipisahkan oleh karakter garis miring (misalnya rgb:1/24/86).

Perhatikan bahwa urutan ini adalah urutan "Perintah sistem operasi" OSC, dan bukan CSI seperti banyak urutan lain yang tercantum, dan karenanya dimulai dengan "\x1b]", bukan "\x1b[". Sebagai urutan OSC, mereka diakhir dengan Terminator String yang direpresentasikan sebagai <ST> dan ditransmisikan dengan ESC \ (0x1B 0x5C). BEL (0x7) dapat digunakan sebagai terminator, tetapi bentuk yang lebih panjang lebih disukai.

Sequence Deskripsi Perilaku
ESC ] 4 ; <i> ; rgb : <r> / <g> / <b><ST> Ubah Warna Layar Mengatur indeks <palet warna layar i> ke nilai RGB yang ditentukan dalam <r>, g>, <<b>

Perubahan Mode

Ini adalah urutan yang mengontrol mode input. Ada dua set mode input yang berbeda, Mode Kunci Kursor dan Mode Kunci Keypad. Mode Tombol Kursor mengontrol urutan yang dipancarkan oleh tombol panah serta Beranda dan Akhir, sementara Mode Tombol Keypad mengontrol urutan yang dipancarkan oleh tombol pada numpad terutama, serta tombol fungsi.

Masing-masing mode ini adalah pengaturan boolean sederhana – Mode Kunci Kursor adalah Normal (default) atau Aplikasi, dan Mode Kunci Keypad adalah Numerik (default) atau Aplikasi.

Lihat bagian Kunci Kursor dan Kunci Numpad & Fungsi untuk urutan yang dipancarkan dalam mode ini.

Sequence Kode Deskripsi Perilaku
ESC = DECKPAM Aktifkan Mode Aplikasi Keypad Kunci keypad akan memancarkan urutan Mode Aplikasi mereka.
ESC > DECKPNM Aktifkan Mode Numerik Keypad Kunci keypad akan memancarkan urutan Mode Numeriknya.
ESC [ ? 1 j DECCKM Aktifkan Mode Aplikasi Kunci Kursor Kunci keypad akan memancarkan urutan Mode Aplikasi mereka.
ESC [ ? 1 l DECCKM Nonaktifkan Mode Aplikasi Kunci Kursor (gunakan Mode Normal) Kunci keypad akan memancarkan urutan Mode Numeriknya.

Status Kueri

Semua perintah di bagian ini umumnya setara dengan memanggil API konsol Get* untuk mengambil informasi status tentang status buffer konsol saat ini.

Catatan

Kueri ini akan memancarkan responsnya ke aliran input konsol segera setelah dikenali pada aliran output saat ENABLE_VIRTUAL_TERMINAL_PROCESSING diatur. Bendera ENABLE_VIRTUAL_TERMINAL_INPUT tidak berlaku untuk perintah kueri karena diasumsikan bahwa aplikasi yang membuat kueri akan selalu ingin menerima balasan.

Sequence Kode Deskripsi Perilaku
ESC [ 6 n DECXCPR Laporkan Posisi Kursor Keluarkan posisi kursor sebagai: ESC [ <r> ; <c> R Where <r> = kursor baris dan <c> = kolom kursor
ESC [ 0 c DA Atribut Perangkat Laporkan identitas terminal. Akan memancarkan "\x1b[?1; 0c", menunjukkan "VT101 dengan Tanpa Opsi".

Tab

Meskipun konsol windows secara tradisional mengharapkan tab memiliki lebar delapan karakter secara eksklusif, *aplikasi nix yang menggunakan urutan tertentu dapat memanipulasi tempat perhentian tab berada di dalam jendela konsol untuk mengoptimalkan gerakan kursor oleh aplikasi.

Urutan berikut memungkinkan aplikasi untuk mengatur lokasi perhentian tab di dalam jendela konsol, menghapusnya, dan menavigasi di antaranya.

Sequence Kode Deskripsi Perilaku
ESC H HTS Horizontal Tab Set Mengatur perhentian tab di kolom saat ini tempat kursor berada.
ESC [ <n> I CHT Tab Horizontal Kursor (Teruskan) Lanjutkan kursor ke kolom berikutnya (dalam baris yang sama) dengan perhentian tab. Jika tidak ada lagi perhentian tab, pindahkan ke kolom terakhir dalam baris. Jika kursor berada di kolom terakhir, pindahkan ke kolom pertama dari baris berikutnya.
ESC [ <n> Z CBT Tab Mundur Kursor Pindahkan kursor ke kolom sebelumnya (di baris yang sama) dengan perhentian tab. Jika tidak ada lagi perhentian tab, pindahkan kursor ke kolom pertama. Jika kursor berada di kolom pertama, tidak memindahkan kursor.
ESC [ 0 g TBC Hapus Tab (kolom saat ini) Menghapus perhentian tab di kolom saat ini, jika ada. Jika tidak, tidak melakukan apa-apa.
ESC [ 3 g TBC Hapus Tab (semua kolom) Menghapus semua perhentian tab yang saat ini diatur.
  • Untuk CHT dan CBT, <n> adalah parameter opsional yang (default=1) menunjukkan berapa kali untuk memajukan kursor ke arah yang ditentukan.
  • Jika tidak ada perhentian tab yang diatur melalui HTS, CHT dan CBT akan memperlakukan kolom pertama dan terakhir jendela sebagai satu-satunya dua perhentian tab.
  • Menggunakan HTS untuk mengatur perhentian tab juga akan menyebabkan konsol menavigasi ke perhentian tab berikutnya pada output karakter TAB (0x09, '\t'), dengan cara yang sama seperti CHT.

Menunjuk Set Karakter

Urutan berikut memungkinkan program untuk mengubah pemetaan set karakter aktif. Ini memungkinkan program untuk memancarkan karakter ASCII 7-bit, tetapi menampilkannya sebagai glyph lain pada layar terminal itu sendiri. Saat ini, satu-satunya dua set karakter yang didukung adalah ASCII (default) dan DEC Special Graphics Character Set. Lihat http://vt100.net/docs/vt220-rm/table2-4.html untuk daftar semua karakter yang diwakili oleh SET Karakter Grafis Khusus DEC.

Sequence Deskripsi Perilaku
ESC ( 0 Menunjuk Set Karakter – Gambar Garis DEC Mengaktifkan Mode Gambar Garis DEC
ESC ( B Menunjuk Set Karakter – ASCII ASCII Mengaktifkan Mode ASCII (Default)

Terutama, mode DEC Line Drawing digunakan untuk menggambar batas dalam aplikasi konsol. Tabel berikut ini memperlihatkan apa yang dipetakan karakter ASCII ke karakter gambar garis mana.

Hex ASCII Gambar Garis DEC
0x6a j
0x6b k
0x6c l
0x6d m
0x6e n
0x71 q
0x74 t
0x75 u
0x76 v
0x77 w
0x78 x

Menggulir Margin

Urutan berikut memungkinkan program untuk mengonfigurasi "wilayah gulir" layar yang terpengaruh oleh operasi pengguliran. Ini adalah subset baris yang disesuaikan ketika layar akan menggulir, misalnya, pada '\n' atau RI. Margin ini juga memengaruhi baris yang dimodifikasi oleh Sisipkan Garis (IL) dan Hapus Baris (DL), Gulir Ke Atas (SU) dan Gulir Ke Bawah (SD).

Margin gulir dapat sangat berguna untuk memiliki sebagian layar yang tidak menggulir saat layar lainnya diisi, seperti memiliki bilah judul di bagian atas atau bilah status di bagian bawah aplikasi Anda.

Untuk DECSTBM, ada dua parameter opsional, <t> dan <b>, yang digunakan untuk menentukan baris yang mewakili garis atas dan bawah wilayah gulir, inklusif. Jika parameter dihilangkan, <t> default ke 1 dan <b> default ke tinggi viewport saat ini.

Margin gulir adalah per buffer, jadi yang penting, Buffer Alternatif dan Buffer Utama mempertahankan pengaturan margin gulir terpisah (sehingga aplikasi layar penuh di buffer alternatif tidak akan meracuni margin buffer utama).

Sequence Kode Deskripsi Perilaku
ESC [ <t> ; <b> r DECSTBM Atur Wilayah Pengguliran Mengatur margin gulir VT dari viewport.

Judul Jendela

Perintah berikut memungkinkan aplikasi untuk mengatur judul jendela konsol ke parameter string> yang diberikan<. String harus kurang dari 255 karakter yang akan diterima. Ini setara dengan memanggil SetConsoleTitle dengan string yang diberikan.

Perhatikan bahwa urutan ini adalah urutan OSC "Perintah sistem operasi", dan bukan CSI seperti banyak urutan lain yang tercantum, dan karenanya dimulai dengan "\x1b]", bukan "\x1b[". Sebagai urutan OSC, mereka diakhir dengan Terminator String yang direpresentasikan sebagai <ST> dan ditransmisikan dengan ESC \ (0x1B 0x5C). BEL (0x7) dapat digunakan sebagai terminator, tetapi bentuk yang lebih panjang lebih disukai.

Sequence Deskripsi Perilaku
ESC ] 0 ; <String><ST> Atur Judul Jendela Mengatur judul jendela konsol ke <string>.
ESC ] 2 ; <String><ST> Atur Judul Jendela Mengatur judul jendela konsol ke <string>.

Karakter yang mengakhiri di sini adalah karakter "Bell", '\x07'

Buffer Layar Alternatif

*Aplikasi gaya Nix sering menggunakan buffer layar alternatif, sehingga mereka dapat memodifikasi seluruh konten buffer, tanpa memengaruhi aplikasi yang memulainya. Buffer alternatif adalah dimensi jendela, tanpa wilayah gulir balik apa pun.

Untuk contoh perilaku ini, pertimbangkan kapan vim diluncurkan dari bash. Vim menggunakan keseluruhan layar untuk mengedit file, lalu kembali ke bash membuat buffer asli tidak berubah.

Sequence Deskripsi Perilaku
ESC [ ? 1 0 4 9 jam Gunakan Buffer Layar Alternatif Beralih ke buffer layar alternatif baru.
ESC [ ? 1 0 4 9 l Gunakan Penyangga Layar Utama Beralih ke buffer utama.

Lebar Jendela

Urutan berikut dapat digunakan untuk mengontrol lebar jendela konsol. Mereka kira-kira setara dengan panggilan API konsol SetConsoleScreenBufferInfoEx untuk mengatur lebar jendela.

Sequence Kode Deskripsi Perilaku
ESC [ ? 3 jam DECCOLM Atur Jumlah Kolom ke 132 Mengatur lebar konsol ke lebar 132 kolom.
ESC [ ? 3 l DECCOLM Atur Jumlah Kolom ke 80 Mengatur lebar konsol ke lebar 80 kolom.

Reset Lunak

Urutan berikut dapat digunakan untuk mereset properti tertentu ke nilai defaultnya. Properti berikut diatur ulang ke nilai default berikut (juga tercantum adalah urutan yang mengontrol properti tersebut):

  • Visibilitas kursor: terlihat (DECTEM)
  • Keypad Numerik: Mode Numerik (DECNKM)
  • Mode Kunci Kursor: Mode Normal (DECCKM)
  • Margin Atas dan Bawah: Atas=1, Bawah=Tinggi Konsol (DECSTBM)
  • Set Karakter: US ASCII
  • Rendisi Grafis: Default/Nonaktif (SGR)
  • Simpan status kursor: Posisi beranda (0,0) (DECSC)
Sequence Kode Deskripsi Perilaku
ESC [ ! p DECSTR Reset Lunak Reset pengaturan terminal tertentu ke defaultnya.

Urutan Input

Urutan terminal berikut dipancarkan oleh host konsol pada aliran input jika bendera ENABLE_VIRTUAL_TERMINAL_INPUT diatur pada handel buffer input menggunakan bendera SetConsoleMode.

Ada dua mode internal yang mengontrol urutan mana yang dipancarkan untuk kunci input yang diberikan, Mode Kunci Kursor dan Mode Kunci Keypad. Ini dijelaskan di bagian Perubahan Mode.

Kunci Kursor

Tombol Mode Normal Mode Aplikasi
Panah atas ESC [ A ESC O A
Panah bawah ESC [ B ESC O B
Panah Kanan ESC [ C ESC O C
Panah Kiri ESC [ D ESC O D
Beranda ESC [ H ESC O H
End ESC [ F ESC O F

Selain itu, jika Ctrl ditekan dengan salah satu tombol ini, urutan berikut dipancarkan sebagai gantinya, terlepas dari Mode Tombol Kursor:

Tombol Mode Apa Pun
Ctrl + Panah Atas ESC [ 1 ; 5 A
Ctrl + Panah Bawah ESC [ 1 ; 5 B
Ctrl + Panah Kanan ESC [ 1 ; 5 C
Ctrl + Panah Kiri ESC [ 1 ; 5 D

Numpad & Kunci Fungsi

Tombol Sequence
Backspace 0x7f (DEL)
Pause 0x1a (SUB)
Escape 0x1b (ESC)
Sisipkan ESC [ 2 ~
Delete ESC [ 3 ~
Halaman Atas ESC [ 5 ~
Halaman Bawah 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 ~

Pengubah

Alt diperlakukan dengan awalan urutan dengan escape: ESC <c> di mana <c> adalah karakter yang diteruskan oleh sistem operasi. Alt+Ctrl ditangani dengan cara yang sama kecuali bahwa sistem operasi akan telah memindahkan <kunci c> ke karakter kontrol yang sesuai yang akan disampaikan ke aplikasi.

Ctrl umumnya diteruskan persis seperti yang diterima dari sistem. Ini biasanya satu karakter yang digeser ke bawah ke ruang cadangan karakter kontrol (0x0-0x1f). Misalnya, Ctrl+@ (0x40) menjadi NUL (0x00), Ctrl+[ (0x5b) menjadi ESC (0x1b), dll. Beberapa kombinasi tombol Ctrl diperlakukan khusus sesuai dengan tabel berikut:

Tombol Sequence
Ctrl + Spasi 0x00 (NUL)
Ctrl + Panah Atas ESC [ 1 ; 5 A
Ctrl + Panah Bawah ESC [ 1 ; 5 B
Ctrl + Panah Kanan ESC [ 1 ; 5 C
Ctrl + Panah Kiri ESC [ 1 ; 5 D

Catatan

Ctrl Kiri + Alt Kanan diperlakukan sebagai AltGr. Ketika keduanya terlihat bersama, mereka akan dilucuti dan nilai Unicode dari karakter yang disajikan oleh sistem akan diteruskan ke target. Sistem akan menerjemahkan nilai AltGr sebelumnya sesuai dengan pengaturan input sistem saat ini.

Sampel

Contoh urutan terminal SGR

Kode berikut menyediakan beberapa contoh pemformatan teks.

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

Catatan

Dalam contoh sebelumnya, string '\x1b[31m' adalah implementasi ESC [ <n> m dengan <n> menjadi 31.

Grafik berikut menunjukkan output dari contoh kode sebelumnya.

output of the console using the sgr command

Contoh Mengaktifkan Pemrosesan Terminal Virtual

Kode berikut memberikan contoh cara yang disarankan untuk mengaktifkan pemrosesan terminal virtual untuk aplikasi. Niat sampel adalah untuk menunjukkan:

  1. Mode yang ada harus selalu diambil melalui GetConsoleMode dan dianalisis sebelum diatur dengan SetConsoleMode.

  2. Memeriksa apakah SetConsoleMode kembali 0 dan GetLastError mengembalikan ERROR_INVALID_PARAMETER adalah mekanisme saat ini untuk menentukan kapan berjalan pada sistem tingkat bawah. Aplikasi yang menerima ERROR_INVALID_PARAMETER dengan salah satu bendera mode konsol yang lebih baru di bidang bit harus menurunkan perilaku dengan baik dan mencoba lagi.

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

Contoh Pilih Fitur Pembaruan Hari Jadi

Contoh berikut dimaksudkan untuk menjadi contoh kode yang lebih kuat menggunakan berbagai urutan escape untuk memanipulasi buffer, dengan penekanan pada fitur yang ditambahkan dalam Anniversary Update untuk Windows 10.

Contoh ini menggunakan buffer layar alternatif, memanipulasi perhentian tab, mengatur margin gulir, dan mengubah kumpulan karakter.

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

}