Tabela powiązań klawiszy?


19

Czy mamy tabelę powiązań klawiszy, która tłumaczy różne sposoby odwoływania się do naciśnięcia klawisza? Używam zsh, ale zakładam, że gdyby istniał taki stół, działałby on dla dowolnej powłoki.

Powód, dla którego pytam, jest taki, że chciałbym przypisać niektóre skróty klawiszowe i nie mam sposobu, aby się do nich odwoływać (chyba że zamierzam ukraść takie, które już zostały zdefiniowane).

Na przykład w zbindkey mamy coś takiego:

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

... i zgaduję, że „kend” oznacza, że ​​odnosi się to do Endklucza.

Sprawdzanie krzyżowe z bindkeyWidzę te linie:

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

... wierzę więc, że jedna z tych linii odnosi się do Endklucza. Który?

Mamy to również w pliku „bindkey”:

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

Teraz zdaję sobie sprawę, że to jest Up Arrowklucz, ale jak mogę się dowiedzieć, jeśli nie wiem?

$ bindkey (at CLI)

... daje nam inny język dla tego samego klucza:

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

... ale przynajmniej teraz wiem, że ^[[Aw bindkey-at-CLI speak jest to samo, co \e[Aw bindkey-in-zbindkey speak. To łatwe. W dawnych czasach w DOS Up Arrow było 0;72- można było znaleźć kod skanowania każdego legalnego naciśnięcia klawisza i był tylko jeden język.

Jest tam stolik? Lub inny sposób na wybranie naciśnięcia klawisza i wiedzieć, jak się do niego odwoływać w terminfo[]... w „bindkey-in-zbindkey” ... w „bindkey-at-CLI” i / lub w jakimkolwiek innym języku zdarzyło się być?

Ponownie, w DOSie był scancodeprogram - wciśnij klawisz, a otrzymasz scancode. To było grzesznie łatwe.


Z odpowiedzi wydaje mi się, że nie ma sposobu, aby wydrukować tabelę wszystkich możliwych powiązań? W każdym razie „bindkey” robi prawie to, co chcę:

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
...

przynajmniej widzę wszystkie istniejące powiązania, nawet jeśli nie wszystkie możliwe powiązania. Teraz, jeśli istnieje tylko sposób na przełożenie kluczowych glifów na „zwykłe” terminy:

bindkey "Home" beginning-of-line

... wtedy byłbym szczęśliwy.


3
Naciśnij Ctrl + V (lub cokolwiek stty -a, co mówi lnext), a następnie klawisz.
Mikel

Odpowiedzi:


16

Interfejs między aplikacją terminala a emulatorem terminala (lub terminalem sprzętowym) przesyła bajty, a nie klucze. Klawisze funkcyjne, takie jak klawisze ruchu kursora, są tłumaczone na sekwencje specjalne (zaczynając od znaku zmiany znaczenia ESC aka \eaka \033aka 0x1b aka ^ [). To samo dotyczy kombinacji klawisza funkcyjnego lub klawisza znakowego z modyfikatorami, chociaż nie wszystkie terminale wysyłają różne sekwencje dla wszystkich różnych kombinacji modyfikatorów. Kilka kluczy jest kodowanych jako znaki kontrolne (np. Tab→ Ctrl-I = \t= \011).

Jak widać, istnieje wiele sposobów opisywania znaków kontrolnych. Niektóre mają nazwy odpowiadające ich tradycyjnej funkcji (np. Tab, przesunięcie wiersza); te mają zwykle kombinację odwrotnego ukośnika + litery, której można używać wewnątrz $'…'lub w argumencie do echolub print(a także w wyrażeniach regularnych sed i literałach łańcuchowych w awk, C i innych językach (zwróć uwagę, że różne narzędzia mogą mieć nieco inny zestaw sekwencji ucieczki)). W \033tych kontekstach możesz także użyć odwrotnego ukośnika + ósemki (np. ).

Istnieje pewna zmiana, które terminale sekwencji ucieczki wysyłają dla każdego klucza. Na szczęście prawie się nie nakłada: istnieje bardzo niewiele sekwencji znaków, które oznaczają różne klawisze na różnych terminalach. Głównym problemem jest znak 127 = \177= 0x7f, który jest Backspaceobecnie najczęściej, ale czasem Delete.

^[OFi ^[[F(tj. \eOFi \e[F) to dwie wspólne sekwencje specjalne wysyłane przez End. ^E(tj. \005) jest powiązaniem klawisza Emacsa ( Ctrl+ E) dla end-of-line.

Aby zobaczyć, co emulator terminala wysyła dla określonego klucza lub kombinacji klawiszy, naciśnij Ctrl+, Va następnie odpowiedni klawisz. To dosłownie wstawia pierwszy znak sekwencji ucieczki. Sekwencje specjalne zwykle składają się ze znaku ucieczki, po którym można drukować znaki, więc reszta sekwencji ucieczki jest wstawiana dosłownie.

Baza danych Terminfo zawiera sekwencje specjalne dla niektórych kluczy. Listę możliwości Terminfo znajdziesz na stronie podręcznika terminfo (5) w twoim systemie. W zsh można wyświetlić wartości w bazie danych za pomocą terminfotablicy asocjacyjnej. Uważaj podczas drukowania wartości, które zawierają sekwencje specjalne, które również są interpretowane przez terminal, gdy są wyświetlane, więc wydrukuj je w formie cytatu.

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

Zobacz Jak działa wprowadzanie za pomocą klawiatury i tekst? dla pełniejszego przeglądu tego, co dzieje się po naciśnięciu klawisza. Nie trzeba rozumieć kluczowych powiązań w zsh.


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

(komentarze, ulepszenia, gorzkie doniesienia mile widziane: rayandrews w eastlink dot ca)

„Dostępne” kombinacje klawiszy na klawiaturze komputera „101” podłączonej do komputera z systemem „zsh” pod xfce4 w systemie Debian Linux (nie wiem, kto jest „odpowiedzialny”). Wszystkie kombinacje, które tworzą duplikaty kodów w „szarych” klawiszach, zostały usunięte, z wyjątkiem pokazanego najprostszego awatara. Uwaga: niektóre szare klawisze / kombinacje mają duplikaty „^ liter”, takie jak „Enter” == ”^ M”, nie zostały one usunięte. Inne aktywne kombinacje nie były „dostępne”, ponieważ były używane przez system, nawet z konsoli, np. Klawisze „Alt + Function” przełączają zaciski. Być może klucz „Meta” zrobiłby więcej, ale ma to 101 KB. Ciekawe, że w DOS-ie jest o wiele więcej kombinacji, takich jak Ctrl + Funkcja - wszystkie dostępne w DOSie, żadna z nich nie jest dostępna w Linuksie, jak się wydaje. Żadna z potrójnych kombinacji klawiszy (np. „Ctrl + Alt + Up”) nie wygenerowała żadnych unikalnych kodów w szarych klawiszach, ale produkuje kody w białych klawiszach. Interesujące anomalie: „^ [[22” ”^ [[27” ”^ [[30” „brakuje”, nie zastanawiasz się, dlaczego te liczby zostały pominięte. (To znaczy, że można się spodziewać, że „F11” będzie oznaczać „^ [[22”, nie „^ [[23”.)

Pokazane kody kluczy wyglądają tak, jakby były wyprowadzane przez „showkeys -a” lub „bindkey” w CLI. Jednak z jakiegoś powodu, jeśli użyjesz „bindkey” w skrypcie (jak w „.zshrc”), „^ [” należy zastąpić „\ e”, a więc w CLI:

bindkey -s '^ [[[[A' 'my-command \ Cm'

... powiąż F1 z „my-command” i uruchom go (klawisz „\ Cm” symuluje klawisz „Enter”).

w „.zshrc”:

bindkey -s '\ e [25' 'my-command1; moje polecenie2 \ Cm ”

... powiąż „Shift-F1” z „my-command1”, a następnie „my-command2” i wykonaj oba z nich.

KOMBINACJE WYKORZYSTUJĄCE TYLKO KLAWISZE „SZARY” :

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

klawisz [ Shift - F1 ] = '^ [[25 ~ ” klawisz [ Shift - F2 ] = ' ^ [[26 ~” klawisz [ Shift - F3 ] = '^ [[28 ~' klawisz [ Shift - F4 ] = ' ^ [ Klawisz [29 ~ ” [ Shift - F5 ] = '^ [ Klawisz [ 31 ~” [ Shift - F6 ] = ' ^ [ Klawisz [ 32 ~ ” [ Shift - F7 ] = „^ [ Klawisz [[33 ~”] [ Shift - F8 ] = „^ [[34 ~”

Klawisz [ Wstaw ] = „^ [ Klawisz [2 ~” [ Usuń ] = „^ [ Klawisz [3 ~” [ Strona główna ] = '^ [ Klawisz [ 1 ~ ” [ Koniec ] = ' ^ [ Klawisz [ 4 ~] [ PageUp ] = „^ [ Klawisz [[5 ~” [ PageDown ] = '^ [ Klawisz [6 ~ ” [W górę ] = ' ^ [ Klawisz [ A” [W dół ] = '^ [ Klawisz B [W prawo ] = '^[[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:

Anomalies: 'Ctrl+`' == 'Ctrl+2', and 'Ctrl+1' == '1' in xterm. Several 'Ctrl+number' 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' (who would have guessed?) 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?

Why is it 'Alt-Function' to change terminals at a terminal, but 'Alt-Ctrl-Function' to change to a terminal from GUI?

Jak / gdzie zdefiniowano Alt - Ctrl - Usuń ”?

enter code here

prawie chcę wysłać e-mail ...
mikeserv

Jak najbardziej to zrobić mike: rayandrews@eastlink.ca
Ray Andrews

to był tylko żart, promień - po prostu często nie widzisz dziwek, uścisków, skarg? napisz do mnie e-mailem ... tutaj. Doceniam to, to wszystko. na marginesie, na marginesie, na zshtemat klawiszy, możesz wypróbować zkbdfunkcję, która powinna dać ci całe mapowanie klawiszy zapisane w pliku. Wierzę, że jest w autoloadstanie, ale jeśli nie, poszukaj tego /usr/share/zsh/functions/Misc. Nawiasem mówiąc, są tam też inne dziwne rzeczy tetris.
mikeserv

To jedno z narzędzi, których użyłem do zrobienia stolika, ale jak sprawić, by od razu odrzuciło „wszystko”?
Ray Andrews,

ciekawe - chyba nie. Nigdy wcześniej go nie uruchamiałem - tylko czytam plik źródłowy - i to było kilka miesięcy temu. Wydaje mi się, że wykonuje serię testów wejściowych, aby wygenerować plik zapisu. ale zapisuje wszystko do pliku, prawda?
mikeserv

6

Istnieje wiele narzędzi do dyspozycji w systemach Unix / Linux, więc może być nieco mylące i przytłaczające. Na początek użyłbym 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

Ze strony podręcznika dotyczącej -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.

Możesz użyć, xmodmapaby uzyskać niektóre z mapowań:

$ 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)

Powyżej nie są to wszystkie elementy układanki, ale dodatkowe informacje, które mogą być pomocne w znalezieniu ostatecznej mapy między skrótami klawiszowymi a skancodami. Więcej informacji znajduje się w tym pytaniu U&L zatytułowanym: Kluczowe mapowania w systemie Linux .

Bibliografia


1
Chociaż wszystko to jest prawdą, nie ma znaczenia, aby zrozumieć powiązania klawiszy w terminalu.
Gilles „SO- przestań być zły”

@Gilles - tak, doszedłem do wniosku, że starałem się tylko dostarczyć potencjalnych klientów, teraz, kiedy przeczytałem twoją sztuczną inteligencję, rozumiem, jak działa ten interfejs, dzięki!
slm

„showkey -a” nie jest jednak bez znaczenia.
skagedal

2

jeśli istnieje tylko sposób na przełożenie kluczowych glifów na „zwykłe” terminy:

bindkey "Home" beginning-of-line

... wtedy byłbym szczęśliwy.

Istnieje infocmpnarzędzie do opisywania terminfowpisów. Jest to szczególnie przydatne w przypadku -Lopcji znanej również z długich nazw zmiennych C :

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

Porównywanie tego do bindkeywyniku

"^[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

widać, że używają innej notacji do ucieczki , ale w zasadzie stosunkowo łatwo jest napisać skrypt, który łączy drugą kolumnę infocmpz pierwszą bindkey.

W przypadku wątpliwości, co oznacza konkretny ciąg znaków (wydrukowany na infocmpwydruku), zawsze można zajrzeć do terminfoinstrukcji, w której podano pełny opis, na przykład

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

0

Używam emulatora terminali URxvt. Jest to użyteczne dla wiązania pokazując takie kody klucza: Ctrl+V. Po naciśnięciu wprowadź pożądaną sekwencję klawiszy i wydrukuje kod. Na przykład mój Ctrl+ ma kod ^[Oa.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.