Akses terprogram ke warna latar belakang xterm saat ini?

13

Saya ingin mengatur warna prompt .bashrctergantung pada warna yang digunakan untuk latar depan dan latar belakang.

Misalnya, prompt biru jika latar belakang terang dan krem ​​jika gelap.

Apakah ada cara untuk mengetahui pengaturan saat ini dalam skrip?

Variabel yang menyedihkan
sumber

Jawaban:

22

Email balik dari Thomas Dickey (pengelola xterm) memiliki ini. Perhatikan khususnya tentang bagian ?. The Ps = 4mengacu OSC Ps ; Pt STmana OSC( "Sistem Operasi Control" prefix) adalah ESC ]dan ST(yang "String Terminator" akhiran) adalah \(backslash). Ini 4adalah salah satu sub-perintah yang mungkin untuk OSC.

Untuk seluruh palet, itu dapat diatur / diambil menggunakan ekstensi warna 88/256. Di ctlseqs.txt, ini dirangkum di sini:

  Ps = 4 ; c ; spec -> Change Color Number c to the color
specified by spec.  This can be a name or RGB specification as
per XParseColor.  Any number of c/spec pairs may be given.
The color numbers correspond to the ANSI colors 0-7, their
bright versions 8-15, and if supported, the remainder of the
88-color or 256-color table.

If a "?" is given rather than a name or RGB specification,
xterm replies with a control sequence of the same form which
can be used to set the corresponding color.  Because more than
one pair of color number and specification can be given in one
control sequence, xterm can make more than one reply.

Beberapa saat kemudian di dalam dokumen terdapat lebih banyak sub- perintah OSC, Ps = 10dan Ps = 11, dan lainnya.

Ps = 1 0  -> Change VT100 text foreground color to Pt.
Ps = 1 1  -> Change VT100 text background color to Pt.

Contoh - ini menanyakan latar belakang menggunakan Ps = "11"(dari atas) dan Pt = "?", dicolokkan ke OSC Ps ; Pt ST. Dalam gema, \033digunakan untuk melarikan diri, dan \\untuk backslash terakhir.

echo -en "\033]11;?\033\\"

Keluaran:

^[]11;rgb:0000/0000/0000^[\ 

Peringatan: Warna yang dikembalikan tidak mencerminkan apakah video terbalik, seperti -rv, diaktifkan, dan merangkak melalui ~ 260 warna yang tersedia via OSC 4 ; c ; ? STtidak menunjukkan apa pun yang mengikuti latar belakang DAN berubah dengan video terbalik. Karena banyak pengguna menetapkan latar belakang gelap dengan menggunakan hanya xterm -rv, ini menyulitkan menentukan apakah latar belakang sebenarnya gelap atau tidak. Kebanyakan warna juga tidak menyesuaikan -rv.

Sebuah skrip untuk melakukan kueri penuh dan benar-benar menangkap balasan dari xterm:

#!/bin/bash
success=false
exec < /dev/tty
oldstty=$(stty -g)
stty raw -echo min 0
col=11      # background
#          OSC   Ps  ;Pt ST
echo -en "\033]${col};?\033\\" >/dev/tty  # echo opts differ w/ OSes
result=
if IFS=';' read -r -d '\' color ; then
    result=$(echo $color | sed 's/^.*\;//;s/[^rgb:0-9a-f/]//g')
    success=true
fi
stty $oldstty
echo $result
$success
Alex North-Keys
sumber
1
Wow ... respons setelah dua tahun ... terima kasih. Saya tidak begitu mengerti penjelasannya tetapi contohnya tidak melakukan apa-apa untuk saya ... tidak menggema.
Variabel sengsara
Heh. Saya menjalankannya kembali dalam xterm yang cukup baru - xterm yang sebenarnya - kali ini dengan semua sumber X saya dilucuti (yang berarti ia menghasilkan semua "f" untuk warna bukan semua "0"). Menggunakan / bin / echo atau bash's builtin echo berfungsi dengan baik. Contoh yang saya coba adalah salin / tempel langsung dari pos di atas. Lingkungan saya adalah Ubuntu 11.10 (turunan Linux / Debian). Saya tidak memiliki OS yang berbeda untuk diuji.
Alex North-Keys
Bergantung pada bagaimana prompt Anda dikonfigurasi, ada kemungkinan bahwa itu mendarat di atas upaya xterm untuk memasukkan input ke terminal Anda sebagai respons terhadap permintaan Anda. Dari sudut pandang shell Anda, balasan xterm terlihat seperti Anda, mengetik.
Alex North-Keys
1
Hmm, terminal gnome di Ubuntu 12.04 mengklaim kompatibel dengan xterm, tetapi tidak mencetak apa pun kembali. Mengapa demikian?
Nik Reiman
1
Sekarang ini adalah voodoo terminal murni. Jawaban yang sangat bagus.
Qix - MONICA DISALAHKAN
0

agak

masukkan pengaturan ke file ~ / .Xdefaults Anda:

xterm*foreground: blue
xterm*background: white

di shell Anda, Anda hanya menerima nilai-nilai:

awk '/xterm\*foreground:(.*)/ { print $2 }' < .Xdefaults

jika tidak, cukup sulit untuk mendapatkan beberapa nilai internal xterm.

akira
sumber
Saya bahkan tidak menggunakan X :) Saya menggunakan rxvt dari cygwin yang berjalan tanpa X server. Selain itu saya ingin dapat menggunakan warna yang berbeda pada host yang berbeda dan untuk tugas yang berbeda, yang mengharuskan saya untuk menanyakan termincal untuk pengaturan.
Variabel sengsara
baik, Anda tidak menentukan OS Anda :)
akira
maaf soal itu. Alasan saya tidak menentukan adalah karena saya mengharapkan solusi didasarkan pada gema beberapa string sihir dan mendapatkan beberapa info kembali di stdout.
Variabel sengsara
baik, apa yang Anda "gema" biasanya tetap di dalam shell (bash, zsh), itu tidak pergi ke xterm (kecuali pada langkah terakhir ketika datang untuk menampilkan output dari perintah).
akira
-1 awk adalah alat yang salah untuk pekerjaan itu.
g33kz0r
-1

Sebenarnya saya pikir Anda menginginkan ini:

% xrdb -query

Itu akan mencantumkan pengaturan untuk Anda. Lihat juga:

http://docstore.mik.ua/orelly/unix3/upt/ch06_08.htm

Untuk memodifikasi runtime, gunakan:

% echo "some*setting: somevalue" | xrdb -merge
g33kz0r
sumber
-querydaftar semua sumber daya. menentukan sumber daya tidak berfungsi di ubuntu saya.
akira
gema "apa pun" | xrdb -merge
g33kz0r
baca kembali pertanyaan: OP ingin mengatur warna BASH PROMPT sesuai dengan pengaturan xterm. OP tidak ingin mengubah sumber daya.
akira
Lihat komentarnya untuk jawaban Anda. Dia ingin "meminta termincal [sic]". Dengan demikian, ia ingin xrdb -query
g33kz0r
jika Anda ingin menjadi spesifik: ia ingin meminta rxvt tanpa menjalankan xserver di windows (yang mungkin) dan xrdb -queryhanya memberi Anda daftar semua sumber daya .. yang harus Anda awk / grep lagi untuk sampai ke latar depan. dan itulah yang sudah saya akui. xrdb -mergesepenuhnya offtopic di sini karena OP tidak ingin memodifikasi sumber daya tetapi penampilan bashprompt.
akira