anahtar bağlama tablosu?


19

Bir tuşa basmanın çeşitli yollarını çeviren bir anahtar bağlama tablosumuz var mı? Ben kullanarak değilim zsh, ama böyle bir tablo olsaydı şimdiye herhangi kabuk için çalışmak olacağını tahmin ediyorum.

Sormamın nedeni, bazı tuş bağlamalarını atamak istiyorum ve bunlara nasıl başvuracağımı bilmenin hiçbir yolu yok (daha önce tanımlanmış olanı çalamayacaksam).

Örneğin, 'zbindkey'de bu tür bir şey var:

[[ "$terminfo[kend]"  == " O"* ]] && \
    bindkey -M emacs "${terminfo[kend]/O/[}"  end-of-line

... ve "kend" in bunun Endanahtar anlamına geldiği anlamına geldiğini tahmin edebilirim .

Çapraz kontrol ile bindkeyşu satırları görüyorum:

"^E" end-of-line
"^[OF" end-of-line
"^[[F" end-of-line

... bu yüzden bu satırlardan birinin Endanahtara atıfta bulunduğuna inanıyorum . Hangisi?

Ayrıca "bindkey" dosyasında da var:

bindkey "\e[A" history-beginning-search-backward

Şimdi, bunun Up Arrowanahtar olduğunu biliyorum , ama bilmediğimi nasıl öğrenebilirim?

$ bindkey (at CLI)

... bize aynı anahtar için farklı bir dil veriyor:

"^[[A" history-beginning-search-backward

... ama en azından şimdi ^[[Abindkey-at-CLI konuşmasında \e[Abindkey-in-zbindkey konuşmasıyla aynı şey olduğunu biliyorum. Bu kolay. DOS Eskiden, Up Arrow oldu 0;72her yasal tuş tarama kodunu bulabildiğim ve tek bir dil yoktu -.

Orada bir masa var mı? Ya da bir tuş vuruşu terminfo[]seçmenin ve buna nasıl atıfta bulunabileceğini bilmenin başka bir yolu ... "bindkey-in-zbindkey" ... "bindkey-at-CLI" ve / veya başka hangi dillerde olabilir olur mu?

Yine, DOS'ta scancodeprogram vardı - bir tuş vuruşu yazın ve tarama kodunu aldınız. Günahkâr kolaydı.


Sanırım cevaplardan tüm olası ciltlerin bir tablosunu yazdırmanın bir yolu yok mu? Neyse 'bindkey' neredeyse istediğimi yapıyor:

pts/2 HP-y5-10-Debian1 root /aWorking/Docs $ bindkey -L
bindkey "^@" set-mark-command
bindkey "^A" beginning-of-line
bindkey "^B" backward-char
bindkey "^D" delete-char-or-list
bindkey "^E" end-of-line
...

en azından olası tüm bağlantıları olmasa bile, mevcut tüm bağlantıları görebilirsiniz. Şimdi, anahtar glifleri 'normal' terimlere çevirmenin bir yolu olsaydı:

bindkey "Home" beginning-of-line

... o zaman mutlu olurdum.


3
Ctrl + V (veya her ne stty -asöylerse lnext) tuşuna basın.
Mikel

Yanıtlar:


16

Bir terminal uygulaması ile bir terminal emülatörü (veya donanım terminali) arasındaki arabirim, anahtarları değil baytları iletir. İmleç hareket tuşları gibi işlev tuşları kaçış dizilerine çevrilir (ESC aka \eaka \033aka 0x1b aka ^ [ çıkış karakteri ile başlayarak ). Aynı durum, bir işlev tuşu veya değiştiricili bir karakter tuşu kombinasyonları için de geçerlidir, ancak tüm terminaller tüm farklı değiştirici kombinasyonları için farklı diziler göndermez. Birkaç anahtar kontrol karakteri olarak kodlanmıştır (örn. Tab→ Ctrl-I = \t= \011).

Gördüğünüz gibi, kontrol karakterlerini tanımlamanın birçok yolu vardır. Bazılarının geleneksel işlevlerine karşılık gelen bir adı vardır (örn. Sekme, Satır besleme); bunlar içinde $'…'veya argümanında echoveya print(ve ayrıca düzenli ifadelerde ve awk, C ve diğer dillerde dize değişmezlerinde kullanabileceğiniz ters eğik çizgi + harf kombinasyonuna sahip olma eğilimindedir (farklı araçların biraz farklı bir kümeye sahip olabileceğini unutmayın) kaçış dizilerinin)). \033Bu bağlamlarda da ters eğik çizgi + sekizli (örn. ) Kullanabilirsiniz .

Her anahtar için kaçış dizisi terminallerinin gönderdiği bazı varyasyonlar vardır. Neyse ki, neredeyse hiçbir çakışma yok: farklı terminalde farklı anahtarlar anlamına gelen çok az karakter dizisi var. Asıl sorun 127 = \177= 0x7f karakteridir ki bu Backspacegünümüzde en sık fakat bazen Delete.

^[OFve ^[[F(yani \eOFve \e[F) tarafından gönderilen iki ortak kaçış dizisidir End. ^E(yani \005) için Emacs anahtar bağlayıcısı ( Ctrl+ E) end-of-line.

Terminal öykünücünüzün belirli bir tuş veya tuş bileşimi için ne gönderdiğini görmek için Ctrl+ Vve sonra söz konusu tuşa basın . Bu, kaçış dizisinin ilk karakterini tam anlamıyla ekler. Kaçış dizileri normalde bir kaçış karakterinden sonra yazdırılabilir karakterlerden oluşur, bu nedenle kaçış dizisinin geri kalanı da tam anlamıyla eklenir.

Terminfo veritabanı bazı tuşlar için çıkış dizileri içerir. Terminfo yeteneklerinin listesini sisteminizdeki terminfo (5) kılavuz sayfasında bulabilirsiniz. Zsh'de, terminfoilişkilendirilebilir dizi aracılığıyla veritabanındaki değerleri listeleyebilirsiniz . Görüntülendiğinde terminal tarafından da yorumlanan kaçış dizileri içerdikleri değerleri yazdırırken dikkatli olun, bu yüzden bunları tırnak formunda yazdırın.

% print -lr ${(q)terminfo[kend]}
$'\033'OF

Bkz. Klavye girişi ve metin çıkışı nasıl çalışır? bir tuşa bastığınızda ne olacağına dair daha kapsamlı bir genel bakış için. Zsh'deki anahtar bağlamaları anlamak gerekli değildir.


11
    BEGINNER'S GUIDE TO ZSH KEYBOARD ASSIGNMENTS, AKA 'KEYBOARD BINDINGS'.

(yorumlar, iyileştirmeler, acı çekimler hoş geldiniz: eastlink dot ca'daki rayandrews)

Debian Linux altında xfce4 altında 'zsh' çalıştıran bir PC'ye bağlı '101' PC klavyesinde 'kullanılabilir' tuş kombinasyonları (Kimin 'sorumlu olduğunu bilmiyorum). 'Gri' tuşlar içinde yinelenen kodlar üreten tüm kombinasyonlar, gösterilen en basit avatar hariç kaldırılmıştır. Bazı gri tuşların / kombinasyonların 'Enter' == '^ M' gibi '^ letter' kopyaları olduğunu unutmayın, bunlar kaldırılmadı. Diğer aktif kombinasyonlar sistem tarafından kullanıldığından 'mevcut değildi', hatta konsoldan, ör. 'Alt + Fonksiyon' tuşları terminalleri değiştirir. Belki 'Meta' tuşu daha fazlasını yapar, ancak bu 101 KB ile. DOS'ta Ctrl + Function gibi çok daha fazla kombinasyonun olması ilginç - hepsi DOS'ta mevcut, hiçbiri Linux'ta mevcut değil, bu yüzden görünüyor. Üçlü tuş kombinasyonlarının hiçbiri (örn. 'Ctrl + Alt + Up') gri tuşların içinde benzersiz kodlar üretmedi, ancak beyaz tuşlarda kodlar üretmiyorlar. İlginç anormallikler: '^ [[22' '^ [[27' '^ [[30' 'eksik', bu sayıların neden atlandığını merak ediyorsunuz. (Yani 'F11' in '^ [[23' değil '^ [[22' olmasını bekleyebilirsiniz.)

Gösterilen anahtar kodları, CLI'daki 'showkeys -a' veya 'bindkey' tarafından verildikleri gibidir. Ancak, bazı nedenlerden dolayı bir komut dosyasında 'bindkey' kullanırsanız ('.zshrc' de olduğu gibi) '^ [' yerine '\ e' yazılmalıdır, bu nedenle CLI'de:

bindkey -s '^ [[[A' 'komutum \ Cm'

... 'F1'i' komutum 'a bağlayın ve çalıştırın (' \ Cm '' Enter 'tuşunu simüle eder).

'.zshrc' içinde:

bindkey -s '\ e [25' 'my-command1; benim komutum2 \ Cm '

... 'Shift-F1'i' my-command1 've ardından' my-command2 'ye bağlayın ve her ikisini de yürütün.

SADECE 'GRİ' TUŞLARI KULLANAN KOMBİNASYONLAR :

anahtar [ F1 ] = '^ [[[A' tuşu [ F2 ] = '^ [[[B' tuşu [ F3 ] = '^ [[[C' tuşu [ F4 ] = '^ [[[D' tuşu [ F5 ] = '^ [[[E' tuşu [ F6 ] = '^ [[17 ~' tuşu [ F7 ] = '^ [[18 ~' tuşu [ F8 ] = '^ [[19 ~' tuşu [ F9 ] = '^ [[20 ~' anahtar [ F10 ] = '^ [[21 ~' anahtar [ F11 ] = '^ [[23 ~' anahtar [ F12 ] = '^ [[24 ~'

tuşu [ Shift - F1 ] = '^ [[25 ~' tuşu [ Shift - F2 ] = '^ [[26 ~' tuşu [ Shift - F3 ] = '^ [[28 ~' tuşu [ Shift - F4 ] = ' ^ [[29 ~ ' tuşu [ Shift - F5 ] = ' ^ [[31 ~ ' tuşu [ Shift - F6 ] = ' ^ [[32 ~ ' tuşu [ Shift - F7 ] = '^ [[33 ~' tuşu [ Shift - F8 ] = '^ [[34 ~'

anahtar [ Ekle ] = '^ [[2 ~' tuşu [ Sil ] = '^ [[3 ~' tuşu [ Ana Sayfa ] = '^ [[1 ~' tuşu [ Son ] = '^ [[4 ~' tuşu [ PageUp ] = '^ [[5 ~' tuşu [ PageDown ] = '^ [[6 ~' tuşu [ Yukarı ] = '^ [[A' tuşu [ Aşağı ] = '^ [[B' tuşu [ Sağ ] = '^[[C' key[Left] = '^[[D'

key[Bksp] = '^?' key[Bksp-Alt] = '^[^?' key[Bksp-Ctrl] = '^H' console only.

key[Esc] = '^[' key[Esc-Alt] = '^[^['

key[Enter] = '^M' key[Enter-Alt] = '^[^M'

key[Tab] = '^I' or '\t' unique form! can be bound, but does not 'showkey -a'. key[Tab-Alt] = '^[\t'

COMBINATIONS USING THE WHITE KEYS:

Anormallikler : 'Ctrl + ` == 'Ctrl + 2' , ve 'Ctrl + 1' == '1' de xterm . Birkaç 'Ctrl + sayı' combinations are void at console, but return codes in xterm. OTOH Ctrl+Bksp returns '^H' at console, but is identical to plain 'Bksp' in xterm. There are no doubt more of these little glitches however, in the main:

White key codes are easy to undertand, each of these 'normal' printing keys has six forms:

A = 'a' ( duhhh ) A - Shift = 'A' ( kim tahmin ederdi ?) A - Alt = '^ [a' A - Ctrl = '^ A' A - Alt -
Ctrl = '^[^A' A-Alt-Shift = '^[A' A-Ctrl-Shift = '^A' (Shift has no effect)

Don't forget that:

/-Shift-Ctrl = Bksp = '^?' [-Ctrl = Esc = '^[' M-Ctrl = Enter = '^M'

And, we can 'stack' keybindings:

bindkey -s '^Xm' "My mistress\' eyes are nothing like the sun."

... Bind 'Ctrl-X' followed by 'm' to a nice line of poetry.

And we can flirt with madness:

bindkey -s '^Pletmenot' 'Let me not, to the marriage of true minds'

... but you hafta start something like that with a 'modifier' character. Try it, if you like keyboard shortcuts, you can really go to town.

QUESTIONS:

Where is it written that 'Ctrl-Bksp' means one thing at console, another thing in xterm?

Are these assignments changable?

Who designed all this, and what were they thinking at the time?

Neden o 'Alt-Function' to change terminals at a terminal, but 'Alt-Ctrl-Function' to change to a terminal from GUI?

' Alt - Ctrl - Delete ' nasıl / nerede tanımlanır?

enter code here

i neredeyse bir e-posta göndermek istiyorum ...
mikeserv

Elbette mike: rayandrews@eastlink.ca
Ray Andrews

bu sadece bir şakaydı, ışın - sık sık sürtükler, tutuklamalar, şikayetler görmüyor musun? bana e-posta gönder ... buralarda by-line. Takdir ettim, hepsi bu. her neyse, bir kenara, zshanahtarlar konusunda, size zkbdbir dosyaya kaydedilmiş tüm anahtar eşlemesini almanızı sağlayacak işlevi denemek isteyebilirsiniz . Mümkün olduğuna inanıyorum autoload, ama eğer değilse, ara /usr/share/zsh/functions/Misc. Bu arada başka garip şeyler de var, bu arada tetris.
mikeserv

Bu benim masamı yapmak için kullandığım araçlardan biri, ama bir anda 'her şeyi' engellemesini nasıl sağlıyorsunuz?
Ray Andrews

ilginç - sanmıyorum. Daha önce hiç çalıştırmadım - sadece kaynak dosyasını okudum - ve bu birkaç ay önceydi. Sanırım kaydetme dosyasını oluşturmak için bir dizi girdi testi yapıyor. ama her şeyi bir dosyaya kaydediyor, değil mi?
mikeserv

6

Unix / Linux'ta pek çok araç var, bu yüzden biraz kafa karıştırıcı ve ezici olabilir. Yeni başlayanlar için showkey:

$ showkey -a

Press any keys - Ctrl-D will terminate this program

a    97 0141 0x61
b    98 0142 0x62
c    99 0143 0x63
d   100 0144 0x64
e   101 0145 0x65
f   102 0146 0x66
g   103 0147 0x67

İlgili adam sayfasından -a:

   When  in  `ascii' dump mode, showkey prints to the standard output the 
   decimal, octal, and hexadecimal value(s) of the key pressed,
   according to he present keymap.

xmodmapEşlemelerden bazılarını almak için kullanabilirsiniz :

$ xmodmap
xmodmap:  up to 4 keys per modifier, (keycodes in parentheses):

shift       Shift_L (0x32),  Shift_R (0x3e)
lock        Caps_Lock (0x42)
control     Control_L (0x25),  Control_R (0x69)
mod1        Alt_L (0x40),  Alt_R (0x6c),  Meta_L (0xcd)
mod2        Num_Lock (0x4d)
mod3      
mod4        Super_L (0x85),  Super_R (0x86),  Super_L (0xce),  Hyper_L (0xcf)
mod5        ISO_Level3_Shift (0x5c),  Mode_switch (0xcb)

Yukarıda bulmacanın tüm parçaları değil, aynı zamanda tuş bağları ve tarama kodları arasındaki nihai haritayı bulmanıza yardımcı olabilecek bazı ek bilgiler. Bu U&L Soru-Cevap bölümünde daha fazla bilgi var: Linux'ta anahtar eşlemeler .

Referanslar


1
Bunların hepsi doğru olsa da, bir terminaldeki anahtar bağlamaları anlamakla alakasız.
Gilles 'SO- kötü olmayı bırak'

@Gilles - evet, sadece kurşun sağlamaya çalıştığımı düşündüm, şimdi AI'nızı okuduğum için bu arayüzün nasıl çalıştığını anladım, teşekkürler!
slm

"showkey -a" alakasız değil.
skagedal

2

anahtar glifleri 'normal' terimlere çevirmenin bir yolu olsaydı:

bindkey "Home" beginning-of-line

... o zaman mutlu olurdum.

Girişleri infocmptanımlamak için bir yardımcı program vardır terminfo. Bu, özellikle uzun C değişken adları-L seçeneği ile kullanışlıdır :

$ infocmp -cL
...
key_home= '\EOH'.
key_up= '\EOA'.
key_down= '\EOB'.
key_right= '\EOC'.
key_left= '\EOD'.
key_backspace= '^H'.
key_end= '\EOF'.
...

Bunu bindkeyçıktı ile karşılaştırma

"^[OH" beginning-of-line
"^[OA" up-line-or-history
"^[OB" down-line-or-history
"^[OC" forward-char
"^[OD" backward-char
"^H" backward-delete-char
"^[OE" end-of-line

kaçış için farklı gösterimler kullandıklarını görebilirsiniz , ancak temelde infocmpilk sütununu bağlayan bir komut dosyası yazmak nispeten kolaydır bindkey.

Belirli bir dizginin ( infocmpçıktıda yazdırıldığı gibi) ne anlama geldiğinden şüphe duyulması halinde terminfo, örneğin tam açıklamanın verildiği yerdeki kılavuza her zaman bakılabilir , örneğin

key_send  ->  shifted end key
key_sic   ->  shifted insert-character key
key_dc    ->  delete-character key

0

URxvt terminal emülatörü kullanıyorum. Böyle kodlarını göstermek için bağlayıcı yararlı bir anahtar var: Ctrl+V. Bastıktan sonra istediğiniz tuş dizisini girin ve kodunu yazdırın. Örneğin, Ctrl+ işaretimin kodu var ^[Oa.

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.