Konsol çıkışının geçerli rengi nasıl belirlenir?


14

Renkli bir terminal varsa , çıkış karakterlerini kullanarak çıkışını renklendirebilirim .

Ancak, çıktının şu anda hangi renk olarak görüntülendiğini bulma olasılığı var mı? Ya da daha iyisi, şu anda çıktı alırsam metnin rengi ne olurdu?

Bu kaçış karakterlerini kullanırken önceki renk ayarlarını bozmamayı istiyorum. 'Varsayılan ön plan rengi' kaçış karakteri, bilgileri değiştirmeden önce metin renginden ziyade renk şemasından alıyor.


Termcap ve terminfo değişkenlerine bakıldığında bunun mümkün olmadığı görülmektedir. Örneğin, terminalinizin desteklediği renk sayısını echotc Coveya alabilirsiniz echoti colors, ancak geçerli renk kodu tanımını depolayan bir değişken yoktur.
jimmij

@jimmij Öyle düşündüm ve bir şeyleri kaçırdığımı umuyordum. Bunun mümkün olmadığından eminseniz, o zaman bir cevap verin ve başka bir şey takip etmiyorsa sonunda kabul edeceğim. Zaman ayırdığınız için teşekkürler.
Minix

Yanıtlar:


11

Genel olarak, mevcut renkleri elde etmek imkansızdır. Bir terminalin kontrol sekansı işlemi, nerede olursa olsun terminalin "içinde" gerçekleşir. Çekirdek sanal terminalleri sağlayan bir işletim sistemi çekirdeği gibi bir terminal emülatörüxterm ile, geçerli "grafik yorumlama" (yani renk ve nitelikler) kavramı da dahil olmak üzere öykünücünün dahili durumu makinenin üzerindedir. ve teorik olarak erişilebilir. Ancak gerçek bir terminal için bu bilgiler, seri bağlantı yoluyla bağlanan fiziksel olarak ayrı bir makinede bazı RAM konumlarındadır.

Bununla birlikte, bazı terminaller, terminal protokolünün bir parçası gibi bu seri bağlantı üzerinden gönderilen bilgileri okumak için bir mekanizma içerir. Bir programın terminale gönderebileceği ve terminal durumu olarak dahili durumu hakkında bilgi göndermesine neden olan kontrol dizileri sağlarlar . mikeservsize xtermterminal öykünücüsünün yanıt verdiği kontrol sekanslarını gösterdi . Ancak bunlar özeldir xterm. Linux çekirdeğindeki yerleşik terminal emülatörleri ve çeşitli BSD çekirdekleri örneğin farklı terminal tipleridir ve bu tür kontrol dizilerini hiç uygulamamaktadır. Aynısı tüm gerçek terminal aileleri için de geçerlidir.

DEC VT525 terminalleri bir okuma mekanizması uygular, ancak tarafından kullanılanlarla hiçbir ilişkisi olmayan bir dizi kontrol dizisine sahiptir xterm. Biri, geçerli grafik yorumlamayı istemek için DECRQSS (İstek Seçme veya Ayarlama) dizisini gönderir ve terminal, DECRPSS (Rapor Seçimi veya Ayarı) göndererek yanıt verir. özellikle:

  1. Ana bilgisayar gönderir: DCS $ q mST (ayar olarak SGR'nin kontrol fonksiyonu kısmı ile DECRQSS)
  2. Terminal yanıt verir: DCS 0 $ r 0 ; 3 3 ; 4 4 mST (geçerli ön plan ve arka plan renklerini ayarlayan bir SGR kontrol dizisinin parametreleri ve kontrol fonksiyonu kısmı ile DECRPSS)

Tabii ki, sorunuzun dikkatli bir şekilde okunması, o Avrupa para birimi sistemlerinde çikolata kaplı bir muz salladığını ortaya koyuyor. Ne konum aslında bir çözüm seçilen ve daha sonra bu çözümün bölümün nasıl sordunuz hangi, yapmaya çalıştığımız, bir önceki durumunu korumalıdır bazı colourized çıktı yazmak ederken. Bunu yapmak için sadece bir DEC VT kontrol dizisi değil, bunun için tanınan bir SCO konsolu terminal dizisi xtermve çeşitli çekirdek yerleşik terminal emülatörleri ve terminaliniz için ne olduğunu söyleyen bir termcap / terminfo girişi vardır.

Termcap girişler scve rc. Terminfo girişleri save_cursorve restore_cursor. İsimler etkili olmak için yanıltıcıdır (her ne kadar de jure yerine fiili olan bir şeye güvendiğinize dair bir uyarı görevi görürler ). Gerçek DECSC, DECRC, SCOSC ve SCORC kontrol sekansları mevcut grafik yorumlamayı da kaydeder ve geri yükler.

İşaret ettiğiniz makalenin tamamı, kabuk komut dosyalarından kontrol dizileri oluşturmakla ilgili olduğu için, şimdi aradığınız komut tput.

daha fazla okuma


Mükemmel cevap. Bunun için geri döndü sevindim. Çok teşekkürler.
Minix

@Minix - scve rcayrıca, terminaliniz destekliyorsa alternatif arabelleğe de bakmak isteyebilirsiniz. Ve evet, bu harika bir cevap. Minix, belki de şuna da bakın: / dev / fb0, kullanıcı alanından bir konsol olarak nasıl kullanılır . noshPaketi kendi vardır önerir.
mikeserv

@mikeserv Ben bir göz atacağım, bağlantılar için teşekkürler :)
Minix

2
Bunun "xterm tarafından kullanılanlarla hiçbir ilişkisi yoktur" - ancak xterm'in bir süredir desteklenen DECRQSS olduğunu fark ettim. Renk dahil SGR yanıtı olan bölüm 1996 yılına kadar uzanır.
Thomas Dickey

2
Bkz Ek okuma xterm renkleri sağlayan başladığı VT520 / vb belgeler mevcut değildi işaret XTerm kontrol-dizileri dokümantasyon, içinde, DECRQSS(... geciktirmek 7 hakkında yıllar).
Thomas Dickey

10

Bir In xtermEğer bir sorguya bir renk değişimi kaçış değiştirerek bildirilen geçerli renk RGB renk kodları alabilirsiniz. ESC ] Ps m- ?işaretini kullanın ancak bir soru işareti ekleyin . Gönderen docs :

  • "?"Bir ad veya RGB belirtimi yerine a verilirse xterm, karşılık gelen dinamik rengi ayarlamak için kullanılabilen aynı formdaki bir kontrol dizisiyle yanıt verir. Bir kontrol sekansında birden fazla renk numarası ve spesifikasyonu verilebildiğinden, xtermbirden fazla cevap verebilir.
    • P s = 1 0 → VT100 metin ön plan rengini P t olarak değiştirin.
    • P s = 1 1 → VT100 metin arka plan rengini P t olarak değiştirin.
    • P s = 1 2 → Metin imleci rengini P t olarak değiştir.
    • P s = 1 3 → Farenin ön plan rengini P t olarak değiştirin.
    • P s = 1 4 → Fare arka plan rengini P t olarak değiştirin.
    • P s = 1 5 → Tektronix ön plan rengini P t olarak değiştirin.
    • P s = 1 6 → Tektronix arka plan rengini P t olarak değiştirin.
    • P s = 1 7 → Vurgu arka plan rengini P t olarak değiştirin.
    • P s = 1 8 → Tektronix imleç rengini P t olarak değiştir.
    • P s = 1 9 → Vurgulama ön plan rengini P t olarak değiştirin.

Bunun başka bir terminal emülatöründe çalışması muhtemelse ciddi şüphelerim var, ancak xtermeğer bir

printf '\033]11;?\007'

... xtermterminalinizin giriş arabelleğine aşağıdaki gibi bir diziyi geri iter ...

11;rgb:ffff/ffff/ffff

... arka plan veya ön plan için:

printf '\033]10;?\007'

10;rgb:0000/0000/0000

Bu yüzden çalıştırdığımda printf '\033]10;rgb:8f8f/8f8f/8f8f8f\007, terminalde daha önce "normal" olan tüm metinler açık maviye dönüştü. Daha sonra, çalıştırma printf '\033]10;rgb:bfbfbf/bfbfbf/bfbfbf\007'tüm açık mavi metni "normal" e döndürür. Bu değeri yalnızca ilerleyen metnin rengini değiştirmek için nasıl kullanabilirim?
fourpastmidnight

@ fourpastmidnight: belki clearönce?
mikeserv

Belgeleri anlamadığımı düşünüyorum. Açıkça "P s = 1 0 -> VT100 ön plan rengini değiştir" yazıyor ve işte böyle görünüyor. ;) Ama beklediğim bu değil. "P s = 10 0; Pt =?" Den alınan RGB değerini kullanmam gerekebilir. istediğimi elde etmek için başka bir kaçış komutuyla.
fourpastmidnight

Tamam, bu nedenle printf '\033]10;?\007'terminalin geçerli ön plan rengi için xterm sorgular. Terminaliniz "normal" ile başladıysa (örn. Ön plan rengi olarak 7), ancak komutu çalıştırmadan tput setaf 3önce çalıştırırsanız, yukarıdaki komut hala "normal" döndürür - ve bu doğru, çünkü bu terminalinizin geçerli ön plan rengi. Ne umuyordum geçerli imleç konumun geçerli rengini almak için bir yoluydu, böylece daha sonra "geri" kaydetmek için kaydedebilirsiniz - OP göre. printfprintf
fourpastmidnight15

1
@ fourpastmidnight - Buradaki yanıttaki bağlantıyı takip ettiniz mi? Ayrıca, Thomas Dickey - (o bu soruya diğer cevabı yorumladı) ise xterm'nın ettirici ve burada aktif bir üyesidir. (bağlantı kendi web sitesine - xtermkaçış belgeleri geniş - ve temelde bir terminal yazmak isteyen herhangi bir programcı için standart referans)
mikeserv
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.