Próbowałem użyć xmodmap
do mapowania META_Lna MENUklucz, ale wydaje się, że nie jest akceptowany bash
jako klucz meta. Zastanawiam się więc, w jaki sposób te komponenty (klawiatura, X, xterm, bash) odnoszą się do każdego z nich w odniesieniu do Meta i Super-Keys. Wszelkie wyjaśnienia będą mile widziane.
Pozwól, że powiem to inaczej. Strona podręcznika bash mówi na przykład, że funkcja yank-nth-arg jest powiązana M-C-yi działa po naciśnięciu Esc-Control-y. Ale uważam to za nieco kłopotliwe. Jak więc zmusić bash do zaakceptowania innego klucza jako Meta(takiego jak Menu) dla wszystkich domyślnych powiązań?
MENU
klucz jest nawet zauważony przez X? Jakiego menedżera okien używasz - niektóre z nich mogą pomóc Ci przedefiniować klucze.Odpowiedzi:
Mapowanie klawiszy klawiatury na modyfikatory takie jak
Meta
iControl
jest obsługiwane przez serwer X (tj. Niskopoziomową część GUI). Mapowaniem tym można manipulować za pomocą polecenia w starym styluxmodmap
lub nowego interfejsu XKB lub za pomocą narzędzi konfiguracyjnych GUI, które wykorzystują jedno z nich pod maską.Domyślnie w większości konfiguracji
Meta
klucz jest oznaczony kluczem Alt. Wynika to z faktu, że historycznie wiele stacji roboczych z systemem UNIX miało klucz oznaczony etykietą, Metapodczas gdy komputery PC mają ten klucz Alt. Więc jeśli masz powiązanieM-C-y
, naciśnij Ctrl+ Alt+ Y.Aby sprawdzić, jakie są twoje aktualne powiązania, uruchom
xev
program w terminalu. Po zaznaczeniu okna xev naciśnij klawisze; w terminalu zobaczysz zapis wygenerowanych zdarzeń.Komunikacja między emulatorami terminali (lub urządzeniami końcowymi odpowiadającymi terminalom fizycznym) a aplikacjami wykorzystuje znaki. Po naciśnięciu Aterminal odbiera informację „
A
klucz, bez modyfikatora”, ale wysyła do aplikacji działającej w terminalu znaka
. Po naciśnięciu klawisza funkcyjnego, takiego jak Uplub F1, nie ma odpowiadającego znaku; terminal wysyła sekwencję znaków rozpoczynającą się od znaku zmiany znaczenia (bajt 27, czasem zapisywany\e
lub^[
). Gdy emulator terminala, taki jak xterm, otrzymał zdarzenie naciśnięcia klawisza zMeta
modyfikatorem, tłumaczy ten klawisz na znak zmiany znaczenia, po którym następuje podstawowa funkcja klawisza, np.\ea
( Klawisz Escape, małe litery a) po naciśnięciu przycisku Meta+ A.Jaka jest dokładna różnica między „terminalem”, „powłoką”, „tty” i „konsolą”? może być przydatnym tłem.
źródło
Kluczowe zdarzenie jest generowane przez serwer X (skonfigurowany przez
xmodmap
) i wysyłane do aplikacji X. Twój menedżer okien może to przechwycić, zanim zostanie wysłany do xterm. Z kolei XTerm tłumaczy zdarzenie na niektóre bajty i wysyła bajty do pseudo-tty przydzielonego przez twoją powłokę, bash.Należy pamiętać, że nie wszystkie zdarzenia są tłumaczone bezpośrednio na bajty przez XTerm. Na przykład klawisze Ctrli shiftsame w sobie generują zdarzenia X na klawiaturze, ale XTerm nie wysyła nic do powłoki (lub innej aplikacji) w niej działającej. Obejmuje to również sam Metaklucz, ale nie Menuklucz. Jednak zdarzenie wygenerowane przez naciśnięcie Meta- espowoduje, że XTerm wyśle bajt 0xE5 lub dwubajtową sekwencję 0x1B 0x65, w zależności od ustawienia zasobu XTerm.VT100.metaSendsEscape.
źródło
Meta-klucz Basha pierwotnie został zdefiniowany w ten sposób (
lib/readline/ChangeLog
):Tak się dzieje w przypadku ncurses i xterm . A kilka terminali przewidziane do wykonywania tej funkcji opcjonalne (ten aspekt nie był rozpowszechniony Większość terminali można spotkać użytkowania Hardcoded zachowania (i nie bardzo ciekawe) W.. Terminfo ręcznych dokumentów stronie te możliwości terminali:
i wyjaśnia funkcję:
Inna funkcja, poprzedzająca znak zmiany znaczenia w odpowiedzi na
Alt
klucz, została włączona do niektórych emulatorów terminali. Bash (właściwiereadline
biblioteka) dokumentuje to użycie w swoim dzienniku zmian z 2004 roku:Meta to specjalny przypadek klawisza modyfikującego . Podobnie jak controli shift, naciskasz go jednocześnie z innym klawiszem i oczekujesz, że zobaczysz coś innego niż samo naciśnięcie klawisza. X zapewnia klucze modyfikatora, przypisując nieco wartość modyfikatora przekazywaną w zdarzeniu X dla klucza. Naciśnięcia klawiszy mogą być wieloma zdarzeniami X; X zapewnia funkcje łączenia tych zdarzeń przy zachowaniu modyfikatorów.
X definiuje również symbole dla każdego klawisza, który może pojawić się na klawiaturze. Zapewnia inne wartości (takie jak Unicode) poprzez specjalną obsługę funkcji łączących zdarzenia.
Ale „meta” to szczególny przypadek.
Aplikacje X nie mają metaklucza, z wyjątkiem konwencji. X nie ma definicji klucza meta ani modyfikatora meta. Tradycyjnie terminale szukają Altklawisza i / lub jednego z modyfikatorów znanych
xmodmap
npmod2
. Późniejsza funkcja xkb komplikuje rzeczy (ale nie zapewnia poprawy w stosunku do tej dyskusji), zapewniając kolejną warstwę informacji, aby znaleźć Altklucz.Konwencja oczywiście może zabrać cię tylko do tej pory, biorąc pod uwagę, że ani
xmodmap
niexkb
wiesz nic szczególnego na temat meta . Na przykład xterm jest konfigurowalny i nie wszyscy użytkownicy chcą konfigurować meta w ten sam sposób. Na przykład Altmoże nie być zamierzonym meta-kluczem, np. Jeśli jest używany wtranslation
zasobie. Kolejnym klawiszem może być klawisz meta, ale użytkownicy (szczególnie ci, którzy używają sekwencji ucieczki w bash), mogą chcieć wysłać znak ucieczki po naciśnięciu Alt. Pamiętaj jednak, że dopóki nie zostanie skonfigurowany jako modyfikator, nic takiego się nie wydarzy: xterm sam nie łączy zdarzeń.xterm ma kilka ustawień zasobów (udokumentowanych na stronie podręcznika ):
altIsNotMeta
ialtSendsEscape
(dodane w 2007 r .).eightBitInput
od 2006 r. odpowiada pierwotnemu sensowi trybu meta, a dla tego zdefiniowano sekwencję ucieczki, która zapewniasmm
irmm
(ustawianie / usuwanie meta-trybu) możliwości terminala.eightBitInput
został zmodyfikowany w 2003 roku w celu uwzględnienia UTF-8 poprzez przesunięcie zdekodowanych wartości Unicode o 128 zamiast surowych bajtów wejściowych.metaSendsEscape
pochodzi z 1999 reightBitInput
jest znacznie starszy niżmetaSendsEscape
. Zaimplementowano wybór pomiędzy trybem meta (dodanie ósmego bitu) lub prefiksem klucza escapeod X11R4 (1989). Ale funkcja została ustalona podczas uruchamiania: została sprawdzona podczas inicjalizacji, aby ustalić, czy wejście zostało ustawione tak, aby zezwalało na 8 bitów, czy tylko na 7. Po tym czasie nie uległo zmianie.Niektórzy ludzie utożsamiają te dwa ( 8-bitowy i prefiks Escape), określając ten drugi jako tryb meta . W zależności od twojego punktu widzenia w tej sprawie
eightBitInput
ustawienie zasobów xterm stanowi część rozwiązania pozwalającego uzyskać wykonalny meta-klucz.Dalsza lektura:
źródło