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.
Contoh Mengaktifkan Pemrosesan Terminal Virtual
Kode berikut memberikan contoh cara yang disarankan untuk mengaktifkan pemrosesan terminal virtual untuk aplikasi. Niat sampel adalah untuk menunjukkan:
Mode yang ada harus selalu diambil melalui GetConsoleMode dan dianalisis sebelum diatur dengan SetConsoleMode.
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");
}