Apakah API grafik terminal itu?

8

Bagaimana program tertentu dapat mengatur warna latar belakang dan font, menulis karakter ke lokasi yang sama di layar (misalnya ke baris ketiga, kolom kelima) lebih dari sekali?

Beberapa contoh adalah bilah kemajuan yang ditampilkan oleh curl google.com > a, beberapa layar instalasi dan hampir semua editor teks.

vemv
sumber

Jawaban:

5

Apa yang Anda tanyakan sebenarnya bukan API grafis, itu hanya karakter kontrol terminal.

Ada banyak sejarah di baliknya, tetapi terminal pada masa itu adalah mesin Teletype . Pada dasarnya sebuah mesin tik dengan kertas pengumpanan track terhubung ke komputer dengan koneksi serial. Mengetik karakter akan mengirim nilai biner itu ke komputer (dan juga mengetiknya di halaman). Komputer akan mencetak karakter kembali sebagai output dari apa pun yang Anda minta.

Karakter khusus digunakan untuk mengendalikan terminal (dari sanalah kunci kontrol berasal, itu untuk menghasilkan karakter tersebut). Misalnya, ^Hatau ^?akan menjadi backspace, ^Madalah carriage return (memindahkan kursor ke awal baris) dan ^Jmerupakan umpan baris (memindahkan halaman ke atas satu baris). Beberapa kode kontrol memiliki urutan keluar dalam C (yang dibagikan oleh hampir semua bahasa pemrograman) untuk menghasilkan karakter kontrol. Kontrol terdaftar sebelumnya akan \b, \r, \nmasing-masing.

The emulator terminal Anda gunakan hari ini adalah hanya apa yang suara seperti, software itu yang berpura-pura menjadi mesin teletype tua. Di satu sisi, hampir seolah-olah Unix masih berpikir Anda menggunakan mesin tik untuk berkomunikasi dengannya.

Dalam kasus curl, ia menulis seluruh baris kemudian mengirimkan \r(carriage return) mengambil kursor ke awal baris kemudian menulis baris lain. Karena umpan baris tidak terkirim, ia terus menulis pada baris yang sama di layar.

Berikut ini sesuatu yang dapat Anda coba tunjukkan:

echo -n  "First" ; sleep 5 ; echo -en "\rSecond\n"

Anda akan melihat kata "Pertama" dicetak (tetapi tidak ada baris baru yang dikirim). 5 detik kemudian akan diganti dengan kata "Kedua" dan baris baru dikirim. Anda dapat mengulangi pola ini tanpa batas. Coba tambahkan "Ketiga" sendiri, Anda akan melihat sesuatu yang mungkin tidak Anda harapkan ;-)

Untuk informasi lebih lanjut tentang ini dan karakter kontrol lainnya lihat ascii(7)manual.

bahamat
sumber
7

Apakah Anda mencari sesuatu seperti ncurses ?

Boris Ivanov
sumber
3
Saat ini, Anda akan menginginkan kutukan baru , atau ncurses.
Steven Senin
Persis. Terima kasih atas koreksi. Saya lupa mereka berbeda.
Boris Ivanov
1

Pertanyaan itu sebenarnya beberapa pertanyaan, dan "karakter kontrol" hanya membahas sebagian kecil saja, misalnya bilah kemajuan untuk curl. Secara umum, ini adalah fitur umum dari terminal (dan emulator terminal).

Sebagian besar fitur umum ini distandarisasi dalam ECMA-48: Fungsi Kontrol untuk Set Karakter Coded . Namun, fitur lainnya tidak . Mereka didefinisikan implementasi.

ECMA-48 mengacu pada fungsi kontrol . Itu termasuk karakter kontrol dan urutan kontrol (sering disebut sebagai urutan melarikan diri, urutan ANSI, dll).

Beberapa karakter kontrol digunakan untuk operasi sederhana , misalnya,

  • pindahkan kursor ke kolom sebelumnya pada baris yang sama
  • pindahkan kursor ke kolom pertama pada baris yang sama
  • pindahkan kursor ke perhentian tab berikutnya di baris yang sama
  • pindahkan kursor ke baris berikutnya (dan gulir layar jika sudah di baris terakhir)

Bilah kemajuan untuk curldibangun menggunakan operasi sederhana ini. Tetapi karakter kontrol hanya bisa melakukan begitu banyak, tidak lebih. Kontrol urutan melakukan lebih banyak, misalnya,

  • pindahkan kursor ke baris / kolom mana saja di layar
  • pindahkan kursor ke baris mana pun di kolom yang sama di layar
  • pindahkan kursor ke kolom mana saja di baris yang sama di layar
  • atur tab-stops di kolom mana saja di layar
  • pindahkan kursor ke baris sebelumnya
  • membuat layar gulir ke atas atau ke bawah tanpa menggerakkan kursor

Begitu banyak persamaan antara sederhana / kompleks. Urutan kontrol juga digunakan untuk mengubah warna teks dan latar belakang, menghapus teks dari layar, menampilkan teks dalam video terbalik (atau cetak tebal, garis bawah, berkedip).

Program yang menggambar urutan kontrol menggunakan reverse-video (atau berwarna) menggunakan bar .

Meskipun urutan kontrol dapat melakukan lebih banyak, mereka hanya dapat melakukan hal-hal tertentu. Menyatukan mereka untuk membuat editor teks, layar instalasi (dan program yang menggambar progress-bar berwarna) menjadi rumit. Beberapa di antaranya dibuat lebih sederhana dengan menggunakan perpustakaan yang tahu tentang hal-hal ini. Awalnya, kami memiliki termcap (dan database beberapa ratus jenis terminal), diperluas ke terminfo (dan database sekitar seribu jenis terminal).

Bahkan dengan standarisasi, ada puluhan deskripsi terminal yang dapat Anda gunakan . Jadi kami terus menggunakan perpustakaan untuk semua kecuali yang paling sepele dari aplikasi ini. Salah satunya adalah ncurses ("kutukan baru"), yang lain adalah bahasa gaul (secara teknis "S-Lang").

Bacaan lebih lanjut:

Thomas Dickey
sumber