Co to jest meta-klucz bash?

16

Próbowałem użyć xmodmapdo mapowania META_Lna MENUklucz, ale wydaje się, że nie jest akceptowany bashjako 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ń?

Lew
źródło
Czy Twój MENUklucz jest nawet zauważony przez X? Jakiego menedżera okien używasz - niektóre z nich mogą pomóc Ci przedefiniować klucze.
choroba

Odpowiedzi:

11

Mapowanie klawiszy klawiatury na modyfikatory takie jak Metai Controljest obsługiwane przez serwer X (tj. Niskopoziomową część GUI). Mapowaniem tym można manipulować za pomocą polecenia w starym stylu xmodmaplub 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 Metaklucz 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ązanie M-C-y, naciśnij Ctrl+ Alt+ Y.

Aby sprawdzić, jakie są twoje aktualne powiązania, uruchom xevprogram 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ę „ Aklucz, bez modyfikatora”, ale wysyła do aplikacji działającej w terminalu znak a. 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 \elub ^[). Gdy emulator terminala, taki jak xterm, otrzymał zdarzenie naciśnięcia klawisza z Metamodyfikatorem, 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.

Gilles „SO- przestań być zły”
źródło
5

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.

Miś
źródło
2

Meta-klucz Basha pierwotnie został zdefiniowany w ten sposób ( 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.

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:

   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)

i wyjaśnia funkcję:

Jeśli terminal ma „klawisz meta”, który działa jak klawisz Shift, ustawiając 8-ty bit dowolnego przesyłanego znaku, fakt ten można wskazać za pomocą km. W przeciwnym razie oprogramowanie przyjmie, że ósmy bit jest parzysty i zwykle zostanie wyczyszczony. Jeśli istnieją ciągi do włączania i wyłączania tego „trybu meta”, można je podać jako smmi rmm.

Inna funkcja, poprzedzająca znak zmiany znaczenia w odpowiedzi na Altklucz, została włączona do niektórych emulatorów terminali. Bash (właściwie readlinebiblioteka) dokumentuje to użycie w swoim dzienniku zmian z 2004 roku:

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 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 xmodmapnp mod2. 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 xmodmapnie xkbwiesz 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 w translationzasobie. 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 ):

  • altIsNotMetai altSendsEscape(dodane w 2007 r .).
  • eightBitInputod 2006 r. odpowiada pierwotnemu sensowi trybu meta, a dla tego zdefiniowano sekwencję ucieczki, która zapewnia smmi rmm(ustawianie / usuwanie meta-trybu) możliwości terminala.
  • eightBitInputzostał 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.
  • metaSendsEscapepochodzi z 1999 r
  • eightBitInputjest 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 eightBitInputustawienie zasobów xterm stanowi część rozwiązania pozwalającego uzyskać wykonalny meta-klucz.

Dalsza lektura:

Thomas Dickey
źródło