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 bindkey
Widzę 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 ^[[A
w bindkey-at-CLI speak jest to samo, co \e[A
w 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ł scancode
program - 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.
źródło
stty -a
, co mówilnext
), a następnie klawisz.Odpowiedzi:
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
\e
aka\033
aka 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 doecho
lubprint
(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\033
tych 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.^[OF
i^[[F
(tj.\eOF
i\e[F
) to dwie wspólne sekwencje specjalne wysyłane przez End.^E
(tj.\005
) jest powiązaniem klawisza Emacsa ( Ctrl+ E) dlaend-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ą
terminfo
tablicy 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.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.
źródło
(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.
źródło
zsh
temat klawiszy, możesz wypróbowaćzkbd
funkcję, która powinna dać ci całe mapowanie klawiszy zapisane w pliku. Wierzę, że jest wautoload
stanie, ale jeśli nie, poszukaj tego/usr/share/zsh/functions/Misc
. Nawiasem mówiąc, są tam też inne dziwne rzeczytetris
.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
:Ze strony podręcznika dotyczącej
-a
:Możesz użyć,
xmodmap
aby uzyskać niektóre z mapowań: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
źródło
Istnieje
infocmp
narzędzie do opisywaniaterminfo
wpisów. Jest to szczególnie przydatne w przypadku-L
opcji znanej również z długich nazw zmiennych C :Porównywanie tego do
bindkey
wynikuwidać, że używają innej notacji do ucieczki , ale w zasadzie stosunkowo łatwo jest napisać skrypt, który łączy drugą kolumnę
infocmp
z pierwsząbindkey
.W przypadku wątpliwości, co oznacza konkretny ciąg znaków (wydrukowany na
infocmp
wydruku), zawsze można zajrzeć doterminfo
instrukcji, w której podano pełny opis, na przykładźródło
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ójCtrl
+↑
ma kod^[Oa
.źródło