Terminal vt100 emulowany Screen (i prawie każdy inny emulator terminala) ma dwa tryby: tryb normalny i tryb aplikacji. Tryb normalny jest używany dla aplikacji wiersz po linii i trybu aplikacji dla aplikacji pełnoekranowych. Wśród różnic między trybami jest to, że klawisze strzałek wysyłają different control sequences (nie wiem dlaczego): np. ESC O A
w trybie pełnoekranowym i ESC [ A
w trybie normalnym. Wygląda na to, że po naciśnięciu klawisza Ctrl + Z, Emacs przełącza terminal z powrotem do trybu normalnego, ale po przywróceniu go na pierwszy plan, nie przełącza się ponownie do trybu pełnoekranowego lub ekran nie reaguje na Emacsa komendy poprawnie.
Jednym z możliwych obejść jest bind the same character sequences w obu trybach w urządzeniu .screenrc
, np.
bindkey -k ku stuff ^[OA
bindkey -k kd stuff ^[OB
bindkey -k kr stuff ^[OC
bindkey -k kl stuff ^[OD
Innym możliwym rozwiązaniem jest poinformowanie Emacs, aby interpretował obie sekwencje klawiszy niezależnie od tego, co mówi terminal. Chociaż jest to w zasadzie zły pomysł, ponieważ niektóre terminale mogą używać tych sekwencji klawiszy dla różnych kluczy, nigdy nie spotkałem się z takim niekompatybilnym terminalem i podejrzewam, że żadne z nich nie zostało wykonane w ciągu ostatnich 20 lat lub dłużej.
(define-key function-key-map "\eOA" [up])
(define-key function-key-map "\e[A" [up])
(define-key function-key-map "\eOB" [down])
(define-key function-key-map "\e[B" [down])
(define-key function-key-map "\eOC" [right])
(define-key function-key-map "\e[C" [right])
(define-key function-key-map "\eOD" [left])
(define-key function-key-map "\e[D" [left])
Prawdziwe rozwiązanie wymagałoby znalezienia przyczyny problemu. Może to być błąd na ekranie, błąd w Emacs, błąd w terminalu (emulator), na którym działa screen, błąd lub błędna konfiguracja w Twojej bazie termcap lub terminfo. Jeśli chcesz to sprawdzić, zacznij od wymieniania systemu operacyjnego, ekranu terminala (emulatora), miejsca, w którym uzyskałeś ekran (lub jak go skompilowałeś, jeśli to zrobiłeś) i jaką wersję, dla Emacs, niezależnie od tego, czy zaobserwowałeś ten sam problem poza ekranem, dane wyjściowe z echo $TERM
i echo -E "$TERMCAP"
wewnątrz ekranu.
Nie należy przypisywać '\ e [A' do' [C-up] 'zamiast' [up] '? (I to samo z innymi wskazówkami?) – robert
@robert Dlaczego warto? '\ e [A' jest tym, co' up' wysyła na wiele terminali. Czy spotkałeś się z takim, w którym 'C-up' wysyła' \ e [A', ale 'up' wysyła coś innego? Co to jest? – Gilles
To początkowo działało dla mnie, ale miałem inne problemy. Naprawiono wszystkie z nich: https://stackoverflow.com/questions/15445481/mapping-arrow-keys-when-running-tmux – robert