Czy są jakieś terminale linux, które mogą obsłużyć wszystkie kombinacje klawiszy?

11

Lubię używać emacsa w trybie terminalowym ( -nw), ale wydaje się, że większość (wszystkie?) Terminali nie obsługuje niektórych kombinacji klawiszy - na przykład C-<RET>lub C-M-%. Wiem, że dzieje się tak, ponieważ większość terminali emuluje VT-100, który nie miał tych kombinacji. Czy są jakieś terminale linuksowe (najlepiej KDE), które mogą obsługiwać te kombinacje klawiszy, czy jest to podstawowe ograniczenie wszystkich terminali?

Yossarian
źródło

Odpowiedzi:

15

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 Ctrl+ Shift+ letterjest często przesyłany domyślnie dokładnie tak jak Ctrl+ letter.

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.

W przypadku niektórych emulatorów terminali można skonfigurować sekwencje specjalne dla każdego klucza. Na terminalach, to odbywa się za pośrednictwem zasobów X . Większość ustawień odczytuje zasoby od ~/.Xresourcesmomentu uruchomienia X i można ręcznie załadować plik xrdb -merge ~/.Xresources.

Term.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 ( 15na 24na F5celu F12- w przypadku przyczyn historycznych F1 do F4mieć różne sekwencje wyjścia) i number2wskazuje modyfikator ( 2o Shift, 3o Meta, 5o Ctrl, 7o Ctrl+ Metai dodać 1 dla Shiftco najmniej jednej Ctrllub Meta).

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[73;5~" [(control return)])
(define-key local-function-key-map "\033[37;6~" [(control ?L)])
Gilles „SO- przestań być zły”
źródło
Tak więc, jeśli dobrze to rozumiem, muszę najpierw zdefiniować sekwencję zmiany znaczenia w moim terminalu, która odpowiada pewnej kombinacji klawiszy. Następnie w emacsie muszę odwzorować sekwencję ucieczki z powrotem na kombinację klawiszy. Czy sekwencja ucieczki może być dowolna, o ile nie koliduje z sekwencjami zdefiniowanymi w infocmp $TERM?
Yossarian
2
@Yossarian Tak. Oprócz braku konfliktu sekwencje specjalne muszą być jednoznaczne, tzn. Żadna sekwencja nie powinna być prefiksem innej. W praktyce oznacza to, że pierwszym znakiem musi być ESC(chyba że chcesz wypróbować jakiś znak ≥128, ale ograniczy to możliwe kodowanie wejściowe), a drugi znak musi być czymś, dla którego nie chcesz ESC foowiązać.
Gilles „SO- przestań być zły”,
Właśnie zacząłem próbować tego, co zasugerowałeś. Powinien local-set-keybyć define-key? Pierwszy z nich podaje błąd (niepoprawna liczba argumentów), podczas gdy drugi działa, przynajmniej dla <kbd> C-Enter </kbd>. Wygląda na to, że konsola nadal ma problemy z wysyłaniem <kbd> CM-% </kbd>.
Yossarian
@Yossarian Rzeczywiście tak powinno być define-key. Nie wiem, czy klucze Escape można skonfigurować, xterm jest prawdopodobnie bardziej konfigurowalny niż jakakolwiek alternatywa.
Gilles „SO- przestań być zły”
1
Zauważ, że xterm Thomasa Dickeya jest w fazie rozwoju. Dzięki XTerm*modifyOtherKeys: 2zasobowi wygeneruje unikalne sekwencje nawet dla C-M-kombinacji, ale przy tym ustawieniu będziesz musiał dostarczyć wiele niestandardowych mapowań ( XTerm*modifyOtherKeys: 1jest mniej wydajny, ale o wiele bardziej funkcjonalny po wyjęciu z pudełka). Na przykład (choć taki, który nie działał dla mnie), zobacz xterm-extras.elbibliotekę i powiązane pliki .Xresourcesoraz .inputrcpliki do pobrania z easyymacs .
phils
1

W przypadku ograniczonego, ale znaczącego zestawu kluczy, zakładając konsolę KDE, można wykonać następujące czynności, aby mieć działające, złożone skróty klawiszowe w emacs -nw:

Wykorzystam moją implementację S-<RET>do pracy jako przykład:

  1. Otwórz nową konsolę, przejdź do ustawień -> bieżący profil -> klawiatura -> edytuj
  2. Naciśnij Dodaj i zrób nowy wpis dla Return+Shifti nadaj mu przydatną sekwencję klawiszy (wybrałem, \E[27;3która moim zdaniem, jest sekwencją klawiszy wysłaną przez X, gdy grzebałem w Xevie, ale może to być źle - ważne jest, aby zrobić upewnij się, że ma właściwą ucieczkę i nie koliduje z niczym innym).
  3. Zagraj z nim w małym obszarze testowym na dole, aby upewnić się, że działa.
  4. Uruchom ponownie konsolę.
  5. Uruchom emacs -nwi w buforze scratch oceń:

    (read-key-sequence-vector "Type your new key:")

    następnie wpisz nową kombinację klawiszy.

    • Jeśli nie jesteś zaznajomiony z tym, napisz linię, zostaw kursor na końcu linii i naciśnij Cx Ce, aby uzyskać emacsa do uruchomienia tej linii, powinien powiedzieć ci wszystko, co wstawisz w cudzysłowach i poczekać, aż to zrobisz Napisz coś.
  6. Powinien wypluć sekwencję klawiszy, którą możesz powiązać.
    (Wróciło [27 91 50 55 59 51]do mnie w przeciwieństwie do nudnego starego, [13]zanim pomieszałem z klawiszem konsoli).

  7. Dodaj do konfiguracji emacsa:

    (define-key function-key-map [27 91 50 55 59 51] [(shift return)])
    
  8. Przetestowałem to emacs -nwpodczas sesji ekranowej przy użyciu:

    (define-key ess-mode-map [(shift return)] #'ess-eval-line-and-step)
    (define-key sh-mode-map [(shift return)]  #'send-line-to-shell)
    
Ashton Trey Belew
źródło
0

Krótka odpowiedź jest taka, że ​​jest to podstawowe ograniczenie wszystkich terminali.

Nieco dłuższą odpowiedzią jest to, że nawet gdyby ktoś stworzył terminal, który robi to, co chcesz, sam Emacs wymagałby poważnych zmian w pracy z tym hipotetycznym terminalem.

hruvulum
źródło
To dobra uwaga na temat emacsa, który nawet nie przyszedł mi do głowy. Chyba zacznę używać GUI.
Yossarian
To jest to co robię.
hruvulum
0

Istnieją pewne wysiłki w celu rozszerzenia protokołu VT w taki sposób, aby umożliwić bezstratne wprowadzanie danych z klawiatury (między innymi z funkcji, takich jak grafika).

Jednym z przykładów jest notty: https://github.com/withoutboats/notty

Vladimir Panteleev
źródło