Saya tahu bahwa, jika terminal berwarna tersedia, orang dapat mewarnai outputnya menggunakan karakter escape .
Tetapi apakah ada kemungkinan untuk mencari tahu, warna apa yang saat ini ditampilkan sebagai output? Atau lebih baik, apa warna teksnya, jika saya akan menampilkannya sekarang?
Saya meminta untuk tidak merusak pengaturan warna sebelumnya, saat menggunakan karakter pelarian ini. Karakter escape 'default foreground color' adalah mendapatkan informasi dari skema warna, daripada warna teks sebelum saya mengubahnya.
colors
console
escape-characters
Minix
sumber
sumber
echotc Co
atauechoti colors
, tetapi tidak ada cukup variabel yang menyimpan kode warna saat ini definisi.Jawaban:
Secara umum, mendapatkan warna saat ini tidak mungkin. Pemrosesan urutan kontrol terminal terjadi "di dalam" terminal, di mana pun itu terjadi. Dengan emulator terminal seperti
xterm
atau yang dibangun ke dalam kernel sistem operasi yang menyediakan terminal virtual kernel, keadaan internal emulator, termasuk gagasan tentang "rendition grafis" saat ini (yaitu warna dan atribut), ada di mesin itu sendiri dan secara teori dapat diakses. Tetapi untuk terminal nyata, informasi ini ada di beberapa lokasi RAM pada mesin yang secara fisik terpisah terhubung melalui tautan serial.Yang mengatakan, beberapa terminal menyertakan mekanisme untuk membaca informasi seperti sebagai bagian dari protokol terminal mereka, yang dikirim melalui tautan serial itu. Mereka memberikan urutan kontrol yang dapat dikirim oleh sebuah program ke terminal, yang menyebabkannya mengirim kembali informasi tentang keadaan internalnya, sebagai input terminal.
mikeserv
telah menunjukkan kepada Anda urutan kontrol yangxterm
merespons emulator terminal. Tetapi ini khusus untukxterm
. Emulator terminal bawaan di kernel Linux dan berbagai kernel BSD adalah tipe terminal yang berbeda, misalnya, dan tidak menerapkan urutan kontrol seperti itu sama sekali. Hal yang sama berlaku untuk seluruh keluarga terminal nyata.Terminal DEC VT525 menerapkan mekanisme pembacaan, tetapi memiliki serangkaian rangkaian kontrol yang tidak memiliki hubungan dengan yang digunakan oleh
xterm
. Seseorang mengirim urutan DECRQSS (Permintaan Pemilihan atau Pengaturan) untuk meminta rendisi grafik saat ini, dan terminal merespons dengan mengirimkan DECRPSS (Pemilihan atau Pengaturan Laporan). Secara khusus:$
q
m
ST (DECRQSS dengan bagian fungsi kontrol SGR sebagai pengaturan)0
$
r
0
;
3
3
;
4
4
m
ST (DECRPSS dengan bagian parameter dan fungsi kontrol dari rangkaian kontrol SGR yang mengatur warna foreground dan background saat ini)Tentu saja, pembacaan yang cermat atas pertanyaan Anda mengungkapkan bahwa Anda mengayunkan pisang yang dilapisi cokelat di sistem mata uang Eropa itu lagi. Apa yang sebenarnya Anda coba lakukan, yang telah Anda pilih solusi dan kemudian bertanya bagaimana melakukan bagian dari solusi itu, adalah mempertahankan keadaan sebelumnya sementara Anda menulis beberapa output berwarna. Tidak hanya ada urutan kontrol DEC VT untuk melakukan hal ini, ada urutan terminal konsol SCO untuknya yang dikenali oleh
xterm
dan berbagai emulator terminal bawaan kernel, dan entri termcap / terminfo yang memberi tahu Anda apa artinya untuk terminal Anda.Entri termcap adalah
sc
danrc
. Entri terminfo adalahsave_cursor
danrestore_cursor
. Nama-nama tersebut agak menyesatkan sebagai efek (meskipun mereka bertindak sebagai peringatan bahwa Anda mengandalkan sesuatu yang secara de facto daripada de jure ). Urutan kontrol DECSC, DECRC, SCOSC, dan SCORC yang sebenarnya juga menyimpan dan mengembalikan rendisi grafik saat ini.Mengingat bahwa artikel yang Anda tunjuk adalah tentang menghasilkan urutan kontrol dari skrip shell, perintah yang Anda cari sekarang adalah
tput
.Bacaan lebih lanjut
sumber
sc
danrc
, Anda mungkin juga ingin melihat ke buffer alternatif jika terminal Anda mendukungnya. Dan ya, ini adalah jawaban yang bagus. Minix, mungkin juga lihat ini: cara menggunakan / dev / fb0 sebagai konsol dari userspace . Thenosh
Suite dia merekomendasikan ada sendiri.DECRQSS
(sekitar 7 tahun menunda ...).Dalam
xterm
Anda bisa mendapatkan kode warna RGB warna saat ini dilaporkan dengan mengubah melarikan diri perubahan warna ke permintaan. GunakanESC ] Ps m
- tetapi tambahkan?
tanda tanya. Dari dokumen :"?"
diberikan alih-alih nama atau spesifikasi RGB,xterm
balas dengan urutan kontrol dengan bentuk yang sama yang dapat digunakan untuk mengatur warna dinamis yang sesuai. Karena lebih dari satu pasang nomor warna dan spesifikasi dapat diberikan dalam satu urutan kontrol,xterm
dapat membuat lebih dari satu balasan.Saya memiliki keraguan serius apakah ini mungkin bekerja di terminal emulator lain, tetapi
xterm
jika Anda menjalankan ......
xterm
akan mendorong kembali ke buffer input terminal Anda urutan seperti berikut ...... untuk latar belakang atau latar depan:
sumber
printf '\033]10;rgb:8f8f/8f8f/8f8f8f\007
, semua teks di terminal yang sebelumnya "normal" berubah menjadi biru muda. Selanjutnya, menjalankanprintf '\033]10;rgb:bfbfbf/bfbfbf/bfbfbf\007'
mengubah semua teks biru muda kembali ke "normal". Bagaimana cara menggunakan nilai ini untuk hanya mengubah warna teks yang bergerak maju?clear
dulu?printf '\033]10;?\007'
tanyakan xterm untuk warna foreground terminal saat ini. Jika terminal Anda dimulai dengan "normal" (mis. 7 sebagai warna latar depan), tetapi Anda menjalankantput setaf 3
sebelum menjalankanprintf
perintah,printf
perintah di atas masih mengembalikan "normal" - dan itu benar, karena itulah warna latar depan terminal Anda saat ini. Apa yang saya harapkan adalah cara untuk mengambil warna saat ini dari posisi kursor saat ini sehingga saya bisa menyimpannya untuk "mengembalikan" nanti - sesuai OP.xterm
pemelihara dan anggota aktif di sini. (tautannya ke situs webnya -xterm
dokumen pelariannya luas - dan pada dasarnya referensi standar untuk setiap programmer lain yang ingin menulis terminal)