2010-12-28 20 views
22

Za każdym razem, gdy używam emacs, mogę używać klawiszy strzałek, aby przesunąć kursor. Ale kiedy używam emacsów na ekranie, a emacs wypycham na drugi plan (ctrl-Z), a następnie zwracam je na pierwszy plan, klawisze strzałek przestają działać, np."screen" jakoś odtrąca moje klawisze strzałek w emacs po^Z

M-[ a is undefined 

Takie zachowanie nie występuje, gdy emacs jest uruchomiony poza ekranem.

Wszelkie pomysły? Czy to ustawienie ekranu?

Odpowiedz

23

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.

+0

Nie należy przypisywać '\ e [A' do' [C-up] 'zamiast' [up] '? (I to samo z innymi wskazówkami?) – robert

+0

@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

+0

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

29

Na co warto, to po prostu się ze mną stało, i udało mi się go poprawić poprzez odłączenie od ekranu, a następnie ponownym:

Ctrl + A, d

ekran -R

+3

To fascynujące. pracował też dla mnie. –

+1

Pracowałem też dla mnie (Debian Wheezy + LXTerminal + emacs 23) –

+0

To działało tylko dla mnie, gdy opuściłem emacs, następnie odłączyłem się od ekranu, ponownie podłączyłem do ekranu i zrestartowałem emacs. Jeśli jesteś w emacs, po wyjściu z ekranu to nie zadziała (nie dla mnie) – juacala

3

Miałem pełne okno z moim xtermem i było na ekranie i tak się stało. Podwójnie kliknąłem granicę xtermy, aby wyjść z trybu pełnoekranowego. Ctrl-z na emacs w tle. Następnie naciśnij klawisz fg, aby go przywrócić, a następnie klawisze strzałek zadziałały. Mogłabym przejść na pełny ekran bez żadnych problemów.

mam proly poznać wszystkie polecenia Emacs nawigacji, ale moje stare nawyki migracji do klawiszy strzałek umrzeć ciężko:/

+0

tak dziwne ... pracował dla mnie –

1

nie odpowiedź, ale warto zauważyć, że opisane zachowanie występuje również wtedy, gdy uruchomiony Emacs GNU na tmux na terminalu Ubuntu lub xterm

Szybka praca polega na tym, aby nie uruchamiać emacsa w tmux.

wersje

Emacsa: GNU Emacsa 24.3.1 (x86_64-PC-Linux-gnu) z 2014-06-06 na krasnoludek, modyfikowane Debiana)

tmux: 1,9

Ubuntu: 14,10

+1

Nie wiem czy to może komuś pomóc, ale mam ten sam problem (ubutu + tmux + emacs): przełączył na pełnym ekranie stan okna, wciśnięty Ctrl-z, i wszystko działało bez zarzutu ponownie ... – Rick77

+0

@ Rick77 jesteś ratownikiem życia, mogę powiedzieć, że obejście po prostu działało dobrze z tmux w ubuntu 12.04. –

0

Oto rozwiązanie, które pracował dla mnie unbreak kiedyś złamane (ubuntu 1404, Emacs 24 .1). Bez odłączania się od ekranu spróbuj wykonać następujące czynności:

1) Ctrl-z, aby zatrzymać emacs.

2) rozpocząć kolejny Emacs: emacs -nw

3) Ctrl-Z w drugim emacs, i voila !, pierwsze Emacs będzie działać ponownie. (Ponownie otwieram drugie emacs i zamykam go Ctrl-x Ctrl-c).

1

Mamy ten sam problem tutaj, obejście tego problemu okazało się, (ale wciąż musimy znaleźć źródło problemu) jest ustawienie „sekwencję aplikacji” ręcznie od wewnątrz emacs:

  • nawigować do bufora *scratch*
  • Wklej: (send-string-to-terminal "\e[?1h")
  • M-x eval-buffer

i voila.

Również proste C-zfg może być za mało, i to szybciej wpisywać TH

+0

Dodałem to do mojego .emacs: '(defun term-send-application-sequence() (interaktywny) (send-string-to-terminal" \ e [? 1h "))' Teraz po przypadkowym 'Cz'' fg' Sprawdzam z 'Mx term-send-application-sequence' i wszystko jest w porządku. – mvanbem

0

najpierw wcisnąć emacsowi tle.

Ctrl+z 

i przywrócić na pierwszy plan.

fg 
Powiązane problemy