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?
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.
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).
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:
Otwórz nową konsolę, przejdź do ustawień -> bieżący profil -> klawiatura -> edytuj
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).
Zagraj z nim w małym obszarze testowym na dole, aby upewnić się, że działa.
Uruchom ponownie konsolę.
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ś.
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).
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.
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).
infocmp $TERM
?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 chceszESC foo
wiązać.local-set-key
być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>.define-key
. Nie wiem, czy klucze Escape można skonfigurować, xterm jest prawdopodobnie bardziej konfigurowalny niż jakakolwiek alternatywa.XTerm*modifyOtherKeys: 2
zasobowi wygeneruje unikalne sekwencje nawet dlaC-M-
kombinacji, ale przy tym ustawieniu będziesz musiał dostarczyć wiele niestandardowych mapowań (XTerm*modifyOtherKeys: 1
jest 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), zobaczxterm-extras.el
bibliotekę i powiązane pliki.Xresources
oraz.inputrc
pliki do pobrania z easyymacs .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:Return+Shift
i nadaj mu przydatną sekwencję klawiszy (wybrałem,\E[27;3
któ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).Uruchom
emacs -nw
i w buforze scratch oceń:(read-key-sequence-vector "Type your new key:")
następnie wpisz nową kombinację klawiszy.
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).Dodaj do konfiguracji emacsa:
Przetestowałem to
emacs -nw
podczas sesji ekranowej przy użyciu:źródło
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.
źródło
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
źródło