Kabukta kontrol karakterleri (^ C, ^ D, ^ [,…) farklı görüntüleme


13

Kabukta kontrol karakterleri yazdığınızda, "düzeltme işareti" adı verilen öğeyi kullanarak görüntülenirler. Örneğin kaçış ^[, düzeltme işareti gibi yazılır.

Havalı kabuğumun havalı görünmesini sağlamak için özelleştirmeyi seviyorum. Mesela kendimi değiştirdim PS1ve PS2renklendirdim. Şimdi kontrol karakterlerinin de normal karakterlerden daha ayırt edilebilir olmasını sağlamak için benzersiz bir görünüm elde etmelerini istiyorum.

$ # Here I type CTRL-C to abort the command.
$ blahblah^C
          ^^ I want these two characters to be displayed differently

Kabuk vurgu kontrol karakterlerini farklı yapmanın bir yolu var mı?

Bunları kalın yazı tipiyle gösterebilir veya normal metinden farklı renklerde görünmesini sağlayabilir miyim?

Burada bash kabuğu kullanıyorum ama soruyu etiketlemedim bashçünkü belki birçok farklı kabuk için geçerli bir çözüm var.

Not ben kontrol karakterlerinin vurgulayarak hangi düzeyde bilmiyorum gerçekleşir. İlk önce kabuğun içinde olduğunu düşündüm. Şimdi kontrol karakterlerinin bash gibi kabuklarda nasıl olduğunu kontrol eden readline olduğunu duydum . Bu yüzden soru şimdi etiketlendi ve hala cevap arıyorum.readline


Sizce kabuk neden onları vurgular? çünkü bashbu readlineşeyleri idare ediyor ve diğerlerinin çoğu için tty sürücüsü.
mikeserv

Bilmiyordum. Bu yüzden notu yazdım. Benim tahminim buydu çünkü diğer uygulamalar kontrol karakterlerini normal metinden farklı olarak beğenir vive lessvurgular. Soruyu bu bilgilerle düzenleyeceğim. Teşekkür ederim!
wefwefa3

mantıklı. bu tür şeyler bir kabuk için daha zordur çünkü ikinci bir önceliktir. editörleri ile tüm iş bir ekran <> dosya arayüzü sağlamaktır, ancak kabuk önce yorumlanmış bir dil için bir komut yorumlayıcı ve ikinci bir çizgi editörü (ya da hiç) .
mikeserv

Taleb diğer programlar tarafından kullanılır, aynı zamanda bir Bash kısmı: o içine bağlanmış bir kütüphanedir. Ve bugünün mermileri, özellikle de bash, düşünebileceğiniz hemen hemen her şeyi yapıyor.
alexis

Sadece zshbunu kutunun dışında kullanın .
Stéphane Chazelas

Yanıtlar:


20

Tuşuna bastığınızda Ctrl+X, terminal öykünücünüz bayt 0x18'i sahte terminal çiftinin ana tarafına yazar.

Bundan sonra ne olacağı, tty hattı disiplininin (çekirdeğin ana tarafı (öykünücünün kontrolü altında) ile slave tarafı (terminalde çalışan uygulamaların etkileşime girdiği) arasında yer alan bir yazılım modülü) nasıl yapılandırıldığına bağlıdır.

Bu yapılandırmak için bir komut tty satırı disiplin olan sttykomut.

Bunun gibi aptal bir uygulamayı çalıştırırken cat, stdin'in bir terminal olup olmadığının farkında değildir ve terminal, tty hattı disiplininin ham bir hat editörü uyguladığı varsayılan bir kanonik moddadır .

Bu ham satır düzenleyiciden daha fazlasına ihtiyaç duyan bazı etkileşimli uygulamalar , başlangıçta bu ayarları değiştirir ve ayrılırken geri yükler. Modern mermiler, anında bu tür uygulamalara örnektir. Kendi daha gelişmiş çizgi editörlerini uygularlar.

Tipik olarak, bir komut satırı girerken, kabuk tty satır disiplinini bu moda sokar ve geçerli komutu çalıştırmak için enter tuşuna bastığınızda, kabuk normal tty modunu geri yükler (istemi vermeden önce yürürlükte olduğu gibi).

stty -aKomutu çalıştırırsanız , aptal uygulamalar için geçerli ayarları görürsünüz . Sen görmek olasıdır icanon, echove echoctlayarları etkinleştirilen.

Bunun anlamı şudur:

  • icanon: bu ham hat düzenleyici etkin.
  • echo: yazdığınız karakterler (terminal öykünücüsünün ana yüzeye yazdığı) geri yankılanır (terminal öykünücüsü tarafından okunabilir).
  • echoctl: Yerine olmanın yankılandı asis, kontrol karakterleri olan yankılandı olarak ^X.

Diyelim ki yazıyorsunuz A B Backspace-aka-Ctrl+H/? C Ctrl+X Backspace Return.

Terminal emülatörü gönderecektir: AB\bC\x18\b\r. Hat disiplin olacaktır echo geri: AB\b \bC^X\b \b\b \b\r\nve köle tarafında giriş okur bir uygulama ( /dev/pts/x) okuyacaktır AC\n.

Uygulamanın gördüğü AC\ntek şey ve sadece bastığınızda, orada Enterçıktı üzerinde herhangi bir kontrolü olamaz ^X.

Eko için ilk ^H( ^?bazı terminallerde, eraseayara bakın ) \b \bterminale geri gönderildiğini fark edeceksiniz . Bu ikinci olurken, yine, hareket imleç, imleç geri çekmeme boşlukla üzerine yazmak dizisi var ^Hsonuçlandı \b \b\b \bbu iki silmek ^ve Xkarakterleri.

^X(0x18) kendisi tercüme ediliyordu ^ve Xçıkış için. Gibi Bbiz Backspace ile silinmiş olarak, bunun, uygulamaya yapmamıştır.

\r(aka ^M) yankı için ( ) ve başvuru için \r\n( ) olarak çevrilmiştir .^M^J\n^J

Peki, bu aptal uygulamalar için seçeneklerimiz neler :

  • devre dışı bırak echo( stty -echo). Bu, kontrol karakterlerinin yankılanma şeklini etkili bir şekilde değiştirir, hiçbir şey yankılanmadan. Gerçekten bir çözüm değil.
  • devre dışı bırak echoctl. Yani (dışındaki yolu kontrol karakterleri değiştirir ^H, ^Myankılandı edilir ... çizgi editörü tarafından kullanılan ve diğer tüm olanları). Daha sonra olduğu gibi yankılanırlar . Yani, ESC karakteri \e( ^[/ 0x1b) bayt (terminal tarafından bir kaçış dizisinin başlangıcı olarak kabul edilir) olarak ^Ggönderilir, bir \a(BEL, terminalinizi bip sesi çıkarır) gönderirsiniz ... Seçenek değil .
  • ham çizgi düzenleyiciyi devre dışı bırak ( stty -icanon). Ham uygulamalar çok daha az kullanılabilir hale geleceğinden gerçekten bir seçenek değil.
  • tty line disiplininin davranışını değiştirmek için çekirdek kodunu düzenleyin, böylece bir kontrol karakterinin yankısı\e[7m^X\e[m sadece yerine gönderilir ^X(burada \e[7mçoğu terminalde genellikle ters videoyu etkinleştirir).

Bir seçenek rlwrap, aptal uygulamalara süslü bir çizgi editörü eklemek için kirli bir hack gibi bir sarmalayıcı kullanmak olabilir . Bu sargı read(), terminal aygıtından readline satır düzenleyicisine (tty line disiplini modunu değiştiren) basit çağrıları değiştirmeye çalışır .

Daha da ileri giderek, GNU ekranının özelliğine dayanarak zsh'ın hat düzenleyicisini ( ters videoda vurgulamak için) gerçekleşen terminalden gelen tüm girişleri ele geçiren böyle bir çözümü bile deneyebilirsiniz .^X:exec

Şimdi kendi çizgi editörlerini uygulayan uygulamalar için yankının nasıl yapıldığına karar vermek onlara kalmış . bashkontrol karakterlerinin nasıl yankılanacağını özelleştirmek için herhangi bir desteği olmayan readline kullanır.

İçin zsh, bkz:

info --index-search='highlighting, special characters' zsh

zshyazdırılamayan karakterleri varsayılan olarak vurgular. Vurgulamayı örneğin ile özelleştirebilirsiniz:

zle_highlight=(special:fg=white,bg=red)

Bu özel karakterler için kırmızı üzerine beyaz vurgulama.

Ancak bu karakterlerin metin gösterimi özelleştirilemez.

UTF-8 yerelinde, 0x18 olarak görüntülenecek ^X, \u378, \U7fffffffolarak (iki atanmamış Evrenkodlu noktaları) <0378>, <7FFFFFFF>, \u200b(a not-gerçekten yazdırılabilir unicode karakter) <200B>.

\x80bir iso8859-1'de yerel olarak ^�... vb.


3

Genellikle .bashrc dosyamda bu kodu var:

function get_exit_status()
{
        local code=$?
        if [ $code -ne 0 ]
        then
                printf $'\001\033[31m\002'"($code)"$'\001\033[0m\002'" "
        fi
}

ve sonra PS1'imde bu işlevi çağırıyorum

PS1='\u@\h \w $(get_exit_status)'

Bununla, ^ C tuşuna basarsanız, isteminizde göreceksiniz

I@mycomputer ~ ^C
I@mycomputer ~ (130)

"0" olmayan tüm çıkış durum kodları istenir.


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.