Bash'ın meta anahtarı nedir?


16

Ben kullanmaya çalıştı xmodmapharitaya META_Liçin MENUanahtarla ama tarafından kabul edilmesi görünmüyor bashmeta anahtar olarak. Bu yüzden, bu bileşenlerin (klavye, X, xterm, bash) Meta ve Süper Tuşlar açısından nasıl birbirleriyle ilişkili olduğunu merak ediyorum. Herhangi bir açıklama takdir edilecektir.

Bunu başka bir şekilde ifade edeyim. Bash man sayfası, örneğin, yank-nth-arg işlevinin bağlı olduğunu M-C-yve bastığımda çalıştığını söylüyor Esc-Control-y. Ama bunu biraz hantal buluyorum. Peki bash'ı diğer tüm anahtarları varsayılan bağlamaları için Meta(gibi Menu) kabul etmesini nasıl sağlayabilirim ?


Sizin mi MENUanahtar bile X tarafından fark? Hangi pencere yöneticisini kullanıyorsunuz - bazıları anahtarlarınızı yeniden tanımlamanıza yardımcı olabilir.
choroba

Yanıtlar:


11

Gibi değiştiricileri için klavye tuşlarından haritalama Metave ControlX sunucusu (GUI yani düşük seviyeli kısmı) tarafından ele alınır. Bu eşleme, eski stil xmodmapkomutu veya yeni stil XKB arabirimi veya bunlardan birini başlık altında kullanan bir GUI yapılandırma araçları aracılığıyla değiştirilebilir.

Varsayılan olarak, çoğu kurulumda, Metaanahtar etiketli anahtardır Alt. Bunun nedeni, tarihsel olarak, birçok unix iş istasyonunun MetaPC'lerde etiketli bir anahtarın bulunduğu bir anahtar bulunmasıydı Alt. Dolayısıyla, bağlantınız varsa + + M-C-ytuşlarına basın .CtrlAltY

Mevcut bağlantılarınızın ne olduğunu kontrol etmek için xevbir terminalde programı başlatın . Xev penceresi odaklanmışken tuşlara basın; terminalde oluşturulan olayların bir dökümünü göreceksiniz.

Terminal emülatörleri (veya fiziksel terminallere karşılık gelen terminal cihazları) ve uygulamalar arasındaki iletişim karakterleri kullanır. Tuşuna bastığınızda A, terminal “ Aanahtar, değiştirici yok ” bilgilerini alır , ancak terminalde çalışan uygulamaya gönderdiği karakterdir a. UpVeya gibi bir işlev tuşuna bastığınızda F1, karşılık gelen karakter yoktur; terminal kaçış karakteriyle başlayan bir karakter dizisi gönderir (bayt 27, bazen yazılır \eveya ^[). Xterm gibi bir terminal öykünücüsü, Metadeğiştiriciyle bir tuşa basma olayı aldığında , bu tuşu bir çıkış karakterine ve ardından tuşun altında yatan işleve, örneğin + \eatuşuna bastığınızda (çıkış, küçük harf a) çevirir .MetaA

'Terminal', 'kabuk', 'tty' ve 'konsol' arasındaki kesin fark nedir? yararlı bir arka plan olabilir.


5

Anahtar olay X sunucusu tarafından (yapılandırıldığı gibi xmodmap) oluşturulur ve X uygulamanıza gönderilir. Pencere yöneticiniz xterm'e gönderilmeden önce bunu kesebilir. XTerm, sırayla, olayı bazı baytlara çevirir ve baytları kabuğunuz tarafından atanan sözde tty'ye gönderir, bash.

Tüm etkinliklerin XTerm tarafından doğrudan baytlara çevrilmediğini lütfen unutmayın. Örneğin, Ctrlve shifttuşları kendiliğinden X klavye olayları oluşturur, ancak XTerm içinde çalışan kabuğa (veya başka bir uygulamaya) hiçbir şey göndermez . Bu, Metaanahtarı tek başına içerir , ancak Menuanahtarı içermez. Ancak, Meta- düğmesine basılarak oluşturulan olay e, XTerm'in XTerm.VT100.metaSendsEscape kaynak ayarına bağlı olarak bayt 0xE5 veya iki bayt dizisi 0x1B 0x65 göndermesini sağlar.


2

Bash'in meta anahtarı aslında şu şekilde tanımlandı ( lib/readline/ChangeLog):

Mon Jul 13 11:34:07 1992  Brian Fox  (bfox@cubit)
        * readline.c: (rl_variable_bind) New variable "meta-flag" if "on"
        means force the use of the 8th bit as Meta bit.  Internal variable
        is called meta_flag.

Ncurses ve xterm ile yorumlanma şekli budur . Bir kaç Bu özellik isteğe yapmak için sağlanan terminaller (yani boy yaygın değildi terminalleri çoğu, kullanımı kodlanmış davranışı (ve çok ilginç değil) karşılaşacak.. Terminfo'ya manuel sayfa belgelerde bu uç yetenekleri:

   has_meta_key              km     km   Has a meta key
                                         (i.e., sets 8th-bit)
   meta_off                  rmm    mo   turn off meta mode
   meta_on                   smm    mm   turn on meta mode
                                         (8th-bit on)

ve özelliği açıklar:

Terminalde, iletilen herhangi bir karakterin 8. bitini ayarlayan bir üst karakter tuşu görevi gören bir "meta anahtar" varsa, bu durum ile belirtilebilir km. Aksi takdirde, yazılım 8. bitin eşlik olduğunu varsayar ve genellikle silinir. Dizeleri bu "meta mod" ve kapatmak için varsa, bunlar da verilebilir smmve rmm.

AltBazı terminal öykünücülerine anahtara yanıt olarak bir kaçış karakterini önekleyen farklı bir özellik eklenmiştir. Bash (aslında readlinekütüphane) 2004'teki değişim günlüğünde kullanılan belgeleri :

lib/readline/callback.c            
        - use _rl_dispatch_callback and a chain of _rl_keyseq_contexts to
          simulate the recursion used to decode multicharacter key sequences
          (even things like ESC- as meta-prefix

Meta, değiştirici anahtarın özel bir halidir . Gibi controlve shift, başka bir tuşla aynı anda basarsınız ve tuşa tek başına basmaktan farklı bir şey görmeyi beklersiniz. X, anahtarın X olayında iletilen değiştirici değerine bir bit atayarak değiştirici anahtarlar sağlar. Tuşa basma birden çok X olayı olabilir; X, değiştiricileri korurken bu olayları birleştirmek için işlevler sağlar.

X ayrıca klavyenizde görünebilecek tuşların her biri için semboller tanımlar. Olayları birleştiren işlevlerde özel işlemlerle diğer değerleri (Unicode gibi) sağlar.

Ancak "meta" özel bir durumdur.

X uygulamalarının metakural dışında bir anahtarı yoktur . X'in meta anahtar veya meta değiştirici için bir tanımı yoktur. Geleneksel olarak terminaller, Alt-key ve / veya xmodmapörn mod2. Daha sonraki xkb özelliği, Altanahtarı bulmak için başka bir bilgi katmanı sağlayarak işleri karmaşıklaştırır (ancak bu tartışmaya göre hiçbir iyileştirme sağlamaz) .

Konvansiyon, meta hakkında özellikle hiçbir şey bilmediği xmodmapveya xkbbilmediği göz önüne alındığında, sizi şimdiye kadar alabilir . Örneğin, xterm yapılandırılabilir ve tüm kullanıcılar metaları aynı şekilde yapılandırmak istemez . Örneğin , amaçlanan meta anahtar olmayabilir, örneğin kaynakta kullanılıyorsa . Başka bir anahtar meta anahtar olabilir, ancak kullanıcılar (özellikle bash'da kaçış dizileri kullananlar), basıldıklarında bir kaçış karakteri gönderilmesini isteyebilir . Ancak, değiştirici olarak yapılandırılmadığı sürece bunların hiçbirinin gerçekleşmeyeceğini unutmayın: xterm olayları tek başına birleştirmez.AlttranslationAlt

xterm çeşitli kaynak ayarlarına sahiptir ( manuel sayfada belgelenmiştir ):

  • altIsNotMetave altSendsEscape( 2007'de eklendi ).
  • eightBitInput2006'dan beri orijinal meta mod hissine karşılık gelir ve bunun için smmve rmm(meta modu ayarla / kaldır) terminal yeteneklerini sağlayan bir kaçış dizisi vardır .
  • eightBitInputmodifiye edilmiş 2003 yerine çiğ girdi bayt'tan 128 tarafından deşifre Unicode değerleri kaydırarak dikkate UTF-8 çekin.
  • metaSendsEscape1999 tarihleri
  • eightBitInputdaha yaşlı metaSendsEscape. Bu, meta mod (sekizinci bitin eklenmesi) veya escapeX11R4'ten (1989) beri bir tuşun ön eki arasında bir seçim gerçekleştirdi . Ancak özellik başlangıçta belirlendi: Başlatma sırasında girişin 8 bit veya sadece 7'ye izin verecek şekilde ayarlanıp ayarlanmadığı kontrol edildi. Bundan sonra değişmedi.

Bazı insanlar ikisini ( 8. bit ve kaçış öneki) eşitler, ikincisine meta mod olarak bahseder . Konuya ilişkin bakış açınıza bağlı olarak eightBitInput, xterm'in kaynak ayarı, uygulanabilir bir meta anahtar elde etmenin çözümünün bir parçasıdır.

Daha fazla okuma:

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.