Emacs C-. nie działa w terminalu

11

Używam GNU Emacs, zwykle jak ta, emacs -nwktóra uruchamia wersję terminalową (w przeciwieństwie do wersji GUI z okienkami).

Piszę artykuły szkolne, LaTeXwięc używam ich flyspell-modedo sprawdzania pisowni w emacsie. Działa to dobrze w wersji GUI, ale w terminalu mam problemy z naciśnięciem klawisza C-.( Ctrl- .). W tty nic to nie robi, a w terminatorlub gnome-terminalpo prostu wprowadza „.”.

Co mogę zrobić, aby zrobić to, co robi w wersji okienkowej (pokaż sugestie pisowni dla błędnie napisanego słowa)?

EDYCJA: W przypadku, gdy ma to znaczenie, używam Ubuntu 12.04 z Emacs 23.3.1 (który moim zdaniem jest domyślny z repozytorium 12.04).

cg505
źródło
1
To samo tutaj. Próbowałeś Esc- x flyspell-mode? To działa dla mnie.
Masroor,
No tak. Zawsze zaczynam flyspell-modeod M-x, ale ESC xnie robi to żadnej różnicy.
cg505
1
To samo tutaj. Jednak znalazłem domyślne skrót klawiszowy, który działa dla obu wersji ESC-TAB.
McNisse,
Tak, ESC TABalbo M-TABobie działają dla mnie. Dzięki za wskazówkę @McNisse.
cg505

Odpowiedzi:

4

Wygląda na to, że na istotną część tego pytania udzielono już odpowiedzi w komentarzach, ale aby zająć się pierwotną przyczyną w przypadku, gdy jesteś ciekawy, myślę, że ctrl-. nie działa w terminalu z powodu pewnych ograniczeń emulatorów terminali. W standardowym terminalu zdefiniowano ctrl, aby wysłać kod ASCII klawisza, który naciskasz minus 64 (właśnie dlatego ctrl-J (74) wysyła znak nowej linii (10), a ctrl-I (73) wysyła na przykład tab (9) ). Ponieważ kod ASCII tego okresu wynosi 46, odjęcie 64 dałoby -18, co jest nieprawidłowe, ponieważ jest ujemne i nie ma żadnych negatywnych kodów ASCII, a zatem nic nie jest w stanie odebrać i zrozumieć emacs.

Kiedy uruchamiasz emacsa w trybie okienkowym, mechanizm emulatora terminala jest pomijany i zamiast tego używana jest bardziej niezawodna obsługa klawiatury X11, która może obsługiwać bardziej niejasne naciśnięcia klawiszy (zamiast zmniejszać każde naciśnięcie klawisza do jednego znaku ASCII, program otrzymuje oryginalny klucz plus wszystkie odpowiednie modyfikatory, osobno). Prawdopodobnie niemożliwe jest, aby emacs oparty na tty obsługiwał ctrl-. chyba że wprowadzisz niestandardowe modyfikacje emulatora terminala (i prawdopodobnie również emacsa).

Paweł
źródło
1
Ta odpowiedź jest naprawdę interesująca. Zagłębiłem się i odkryłem, że DEC VT100 działa podobnie, ale inaczej, ściśle mówiąc. Oto, co robi, gdy klawisz kontrolny i inny klawisz są wciśnięte jednocześnie: 1) wyszukaj tabelę ASCII według kodu skanowania klawiatury 2) wyszukaj tabelę prawidłowych kodów sterowania przez ASCII 3) jeśli jest poprawna, zamaskuj bit 5 i bit 6 ASCII 4 ) wysłać. Więc ctrl-J, ctrl-j i ctrl- * mogą wszystkie wysyłać LF, ale sprawdzenie poprawności ogranicza kombinacje. Patrz instrukcja techniczna DEC VT100 sekcja 4-43 (PDF strona 93).
Kenji Noguchi
Mogę uchwycić 'C-.'dobrze za pomocą emacsa w Xterm, ale nie za pomocą urxvt lub st. Wiesz, dlaczego tak może być?
stewSquared
0

Chociaż powyższa odpowiedź stanowi dobre wyjaśnienie, dlaczego nie działa, tak naprawdę nie dotyczy tego, jak to zrobić. Dla iTerm2można rozwiązać ten problem przez dodanie klucza mapowania dla sekwencji ucieczki . Wyobrażam sobie, że byłoby coś podobnego w terminatorlubgnome-terminal

Chris
źródło