Użyj Super w emacs -nw w systemie Linux

15

Z trudem znajdowałem proste i bezpośrednie pytanie do odpowiedzi, dlatego postanowiłem zadać tutaj.

P: Czy jest sposób na użycie Super w Emacsie uruchomionym w terminalu w Linuksie?

PS : Przeczytałem wiele informacji na temat, xmodmapale myślę, że kluczem jest to, że emulator terminala nie może reprezentować super klucza. Jednak (kbd "s-SPC")powroty coś i myślałem korzystania z usługi translacji .Xdefaults/X. Czy jestem na dobrej drodze? Biorąc pod uwagę wynik kbd, co muszę umieścić jako XTerm.VT100.translations?

Andrea Richiardi
źródło

Odpowiedzi:

21

Wygodniejszy będzie X11 Emacs, który może odbierać dane z klawiatury i wyświetlać tekst bez przechodzenia przez kodowanie i dekodowanie terminala . Głównym powodem używania edytora trybu tekstowego jest uruchomienie go na ekranie lub tmuxie na zdalnym komputerze, ale dzięki Trampowi zwykle łatwiej jest edytować plik zdalny w lokalnym Emacsie. Biorąc to pod uwagę, możesz robić, co chcesz, pod warunkiem współpracy emulatora terminala, co ma miejsce w przypadku Xterm.

Po naciśnięciu klawisza lub kombinacji klawiszy w terminalu jest on przesyłany do aplikacji działającej w terminalu jako sekwencja jednego lub więcej znaków. Na przykład po naciśnięciu aaplikacja odbiera a. Po naciśnięciu Enteraplikacja otrzymuje znak CR(aka ^M(wymawia się „control-emm”), aka znak numer 13, aka \rlub \015). Kombinacje klawiszy Altsą zwykle przesyłane jako znak ESC(np. ^[Aka \elub \033), a następnie sekwencja dla klawisza lub kombinacji klawiszy bez Alt. Klawisze funkcyjne i inne kombinacje klawiszy są przesyłane jako sekwencje specjalne rozpoczynające się od \e[lub \eO.

Sekwencje specjalne nie są w pełni znormalizowane, a terminale zwykle ignorują określone atrybuty dla niektórych kluczy. Na przykład hiper i super modyfikatory są zwykle ignorowane. Możesz zobaczyć, co twój terminal wysyła dla kombinacji klawiszy, naciskając Ctrl+, Va następnie tę kombinację klawiszy w wierszu poleceń powłoki, C-qlub C-h cpo kombinacji klawiszy w Emacsie.

Xterm umożliwia skonfigurowanie sekwencje dla każdego klawisza poprzez zasobów X . Większość ustawień odczytuje zasoby od ~/.Xresourcesmomentu uruchomienia X i można ręcznie załadować plik xrdb -merge ~/.Xresources.

XTerm.VT100.translations:       #override \n\
    Ctrl ~Shift ~Meta <Key> Return: string("\033[73;5~") \n\
    Ctrl Shift ~Meta <Key> percent: string("\033[37;6~")

Powszechna konwencja wykorzystuje sekwencje specjalne formy ESC [ number1 ; number2 ~dla klawiszy funkcyjnych z modyfikatorami. number1oznacza klawisz funkcyjny ( 15do 24do F5do F12- ze względów historycznych, poprzez F1 F4mają różne sekwencje) i number2wskazuje na modyfikator ( 2na Shift, 5na Ctrl, 3na Meta, 8na Ctrl+ Metai dodać 1 do + Shift- nie, to nie jest bardzo spójne).

Będziesz musiał określić modyfikatory Hyper i Super poprzez ich liczbę, jak Mod1przez Mod5. Uruchom, xmodmap -pmaby zobaczyć mapowanie kluczy do modyfikatorów. Na przykład, jeśli Super_Ljest związany z Mod5, to następujący wiersz (użyj tego dokładnego przypadku) definiuje powiązanie dla Super+ Space:

    ~Ctrl ~Meta Mod5 <Key> space: string("\033[32;16~") \n\

Emacs tłumaczy sekwencje specjalne na wewnętrzną reprezentację klucza poprzez input-decode-maplublocal-function-key-map (lub function-key-mapprzed Emacsem 23).

(define-key local-function-key-map "\033[32;16~" [(super ?\ )])

Ten post jest wykonany w 80% z materiałów pochodzących z recyklingu. Czy są jakieś terminale linux, które mogą obsługiwać wszystkie kluczowe kombinacje?

Gilles „SO- przestań być zły”
źródło
To świetna odpowiedź, obejmująca całą wiedzę, którą znalazłem trochę rozproszoną. Tylko jedno pytanie: gdzie znalazłeś / jak wybrałeś 32; 16 ~ i dlaczego nie pasuje do poniższego wiązania emacs? Rozumiałem pochodzenie liczb, ale chciałbym zapytać, czy można gdzieś link do tabeli odwzorowania dla number1 i NUMBER2 .
Andrea Richiardi
@AndreaRichiardi Wybrałem 32, ponieważ jest to wartość ASCII / Unicode dla znaku spacji i 16, ponieważ standardowe wiązania używają wartości do 8 dla Ctrl, Meta i Shift. 33 poniżej było literówką. Możesz wybrać wszystko, o ile nie koliduje to z innymi kluczami.
Gilles „SO- przestań być zły”
Musiałem powiązać sekwencję z funkcją, więc chwilowo rozwiązałem (global-set-key "\033[32;16~" 'set-rectangular-region-anchor). Ale żeby być kompletnym, próbowałem twojego define-keypowyżej, ale nie mogłem wtedy uruchomić (global-set-key (kbd "s-SPC") 'set-rectangular-region-anchor). Po prostu drukowałem; 16 ~ w buforze. Byłoby miło powiązać tę sekwencję z (kbd „s-SPC”), aby powiązać sekwencję klawiszy i móc ponownie przypisać ją innym poleceniom.
Andrea Richiardi
C-h lzwraca teraz po naciśnięciu s-SPC: ESC [ 3 2 ; 1 6 ~ale emacs wciąż narzeka, żeM-[ 32 is undefined
Andrea Richiardi
@AndreaRichiardi Po naprawieniu większej liczby literówek w części xterm (którą wydaje się naprawić, ponieważ Emacs otrzymuje zamierzoną sekwencję znaków), działa dla mnie. Czy to działa, jeśli używasz function-key-mapzamiast local-function-key-map? To może być kwestia kiedy ustawisz local-function-key-map, ponieważ jest to zależne od terminala.
Gilles 'SO - przestań być zły'
0

Jeśli chcesz zainstalować pakiet Emacsa i skonfigurować terminal, napisałem pakiet Emacsa, który może nauczyć Emacsa i terminale, jak prawidłowo rozpoznawać wszystkie kombinacje klawiszy klawiatury i modyfikatora:

https://github.com/CyberShadow/term-keys

Kodowanie super modyfikatora nie jest domyślnie włączone, ale pakiet można dostosowywać i umożliwia konfigurowanie, które kombinacje klawiszy modyfikatora są kodowane. Aby włączyć kombinacje klawiszy kodowania, które zawierają super modyfikator, ustaw term-keys/want-key-p-funcfunkcję, która zwraca wartość, tgdy (elt mods 3)nie ma wartości zerowej ( wyjaśnienie znajduje się w domyślnej implementacji ).

Vladimir Panteleev
źródło
0

Mam następujące pliki w moich plikach inicjujących:

(global-set-key [f7] nil)
(global-set-key [f8] nil)
(define-key function-key-map [(f7)] 'event-apply-super-modifier)
(define-key function-key-map [(f8)] 'event-apply-hyper-modifier)

To pozwala mi wysyłać super i hiper-klucze za pomocą klawiszy funkcyjnych.

Realraptor
źródło
-1

Krótka odpowiedź: użyj Konsole.

Wyjaśnienie:

  • Emacs local-function-key-mapma mapowanie wpisów C-x @ sdo event-apply-super-modifier.
  • Konsoleodwzorowuje Super(klawisz z logo Windows) sekwencję ucieczki ^X@s(która wydaje się nigdzie nie udokumentowana, odkryłem ją przypadkiem). Możesz tego spróbować, otwierając Konsolei naciskając np Ctrl-v Win-o.
Ubolonton
źródło
Dzięki za odpowiedź, ale zmiana terminu nie jest rozwiązaniem, którego szukam.
Andrea Richiardi