Shift-strzałka nie działa w emacsach w tmux


26

Niedawno zacząłem używać tmux (wcześniej byłem użytkownikiem ekranu) i uwielbiam to, z wyjątkiem jednego małego problemu. Używam emacsa w mojej sesji tmux i jestem przyzwyczajony do używania klawiszy Shift-strzałek do poruszania się między oknami emacsa (nie oknami tmux). Podczas działania w tmux wiązania wydają się całkowicie przestać działać (to tak, jakby w ogóle nie rejestrowały się w emacs). Jeśli wyjdę z tmux i po prostu uruchomię emacsa w mojej powłoce, działają one dobrze.

Używam iTerm2, ssh'd do Linux-a, tam uruchamiam tmux / emacs. Mam powiązania klawiszy Shift ze strzałką skonfigurowane w następujący sposób w moich plikach .emacs:

(global-set-key "\M-[1;2A" 'windmove-up)
(global-set-key "\M-[1;2B" 'windmove-down)
(global-set-key "\M-[1;2C" 'windmove-right)
(global-set-key "\M-[1;2D" 'windmove-left)

Kiedy nie działam w tmux, mogę potwierdzić, że są to właściwe sekwencje znaków dla kombinacji klawiszy ze strzałką Shift, wykonując Cq w emacsie, a następnie naciskając sekwencję klawiszy. W tmuxie nawet to nie działa, ponieważ wydaje się, że nie widzi żadnych danych wejściowych po naciśnięciu klawisza Shift (tylko siedzi po znaku zachęty Cq).

Patrząc na powiązania klawiszy dla tmux, nie sądzę, aby cokolwiek było związane z klawiszami Shift-strzałkami, a nawet gdyby tak było, rejestrowałyby się tylko po wprowadzeniu prefiksu (co w moim przypadku jest powiązane z Co).

Masz pomysł, jak sprawić, by klawisze Shift-strzałka działały ponownie w tmux?


1
Właściwie znalazłem odpowiedź na to pytanie, ale StackExchange nie pozwoli mi oficjalnie odpowiedzieć na własne pytanie przez kolejne 7 godzin, ponieważ nie mam jeszcze wystarczającej reputacji. W każdym razie, jeśli ktoś jest zainteresowany, wydaje się, że robienie klawiszy xterm-set-set-Option na opcji to naprawia. Ustawiam to jako opcję globalną, umieszczając to w moim pliku .tmux.conf i wydaje mi się, że wróciłem do biznesu: set-window-option -g xterm-keys on
triangle_man

Spróbuj zagłosować, aby zamknąć pytanie, jeśli naprawdę nie możesz
Eir Nym,

Odpowiedzi:


13

Najpierw upewnij się, że TERM jest poprawny w każdej lokalizacji:

  • xterm- coś (np. xterm-256color) w lokalnej powłoce działającej w oknie iTerm2
  • xterm- coś wewnątrz powłoki po SSHing do systemu Linux
    Powinno to być takie samo, jak to, czego używasz lokalnie w iTerm2 , ponieważ SSH powinien przekazywać go do strony zdalnej (i, co ważne, strona zdalna nie powinna ślepo zastępować wartość w pliku inicjalizacji powłoki).
  • screen- coś (np. screen-256color) wewnątrz powłoki działającej pod tmux w systemie Linux
    Powinieneś zawsze używać screenTERM-opartego na tmuxie w tmuxie .

Posiadanie xtermTERM bezpośrednio poza tmux pozwoli tmux rozpoznać zmodyfikowane klawisze strzałek, ale nie przepuści ich, chyba że masz również xterm-keyswłączoną opcję okna. Umieść to w swoim ~/.tmux.confsystemie Linux:

set-window-option -g xterm-keys on

Sekwencje przesuniętych klawiszy powinny teraz przejść do Emacsa , działającego w tmuxie , przez połączenie SSH, w oknie iTerm2 .


Właśnie tego potrzebowałem, aby używać textadept w tmux.
William Hilton,

1
To rozwiązanie nie działało dla mnie. Jestem na Fedorze-23, używając terminala gnome. Moje TERM i .tmux.conf są ustawione zgodnie z opisem w odpowiedzi. Jednak ustawienie powiązań zgodnie z opisem w pytaniu działa. Naprawdę chciałbym rozwiązać tę tajemnicę, ponieważ jest ona również zepsutą aplikacją ncurses, nad którą pracuję.
gogators

1
@gogators to samo tutaj; powyższe rozwiązanie nie działa dla mnie, mimo że miałem dokładnie to, co zostało zasugerowane.
Fingolfin

Ctrl + Shift nie działa, Ctrl + <f #> nie działa i tak dalej. Ctrl + d jednak działa.
avp

W praktyce oznacza to: export XTERM=xterm-256color(Piszę to, ponieważ nie wiedziałem, co oznacza „twój TERM” w odpowiedzi, szukałem komentarza wyjaśniającego, że ... nie było żadnego, a teraz jest taki.)
jhegedus

3

Najpierw musisz włączyć xterm-keysw konfiguracji tmux. Więc włóż następujące~/.tmux.conf

setw -g xterm-keys on

Ale to złamie inne kluczowe kombinacje. Aby je naprawić, włóż następujące elementy do swojego ~/.emacslub ~/.emacs.d/init.elkonfiguracji

;; handle tmux's xterm-keys
;; put the following line in your ~/.tmux.conf:
;;   setw -g xterm-keys on
(if (getenv "TMUX")
    (progn
      (let ((x 2) (tkey ""))
    (while (<= x 8)
      ;; shift
      (if (= x 2)
          (setq tkey "S-"))
      ;; alt
      (if (= x 3)
          (setq tkey "M-"))
      ;; alt + shift
      (if (= x 4)
          (setq tkey "M-S-"))
      ;; ctrl
      (if (= x 5)
          (setq tkey "C-"))
      ;; ctrl + shift
      (if (= x 6)
          (setq tkey "C-S-"))
      ;; ctrl + alt
      (if (= x 7)
          (setq tkey "C-M-"))
      ;; ctrl + alt + shift
      (if (= x 8)
          (setq tkey "C-M-S-"))

      ;; arrows
      (define-key key-translation-map (kbd (format "M-[ 1 ; %d A" x)) (kbd (format "%s<up>" tkey)))
      (define-key key-translation-map (kbd (format "M-[ 1 ; %d B" x)) (kbd (format "%s<down>" tkey)))
      (define-key key-translation-map (kbd (format "M-[ 1 ; %d C" x)) (kbd (format "%s<right>" tkey)))
      (define-key key-translation-map (kbd (format "M-[ 1 ; %d D" x)) (kbd (format "%s<left>" tkey)))
      ;; home
      (define-key key-translation-map (kbd (format "M-[ 1 ; %d H" x)) (kbd (format "%s<home>" tkey)))
      ;; end
      (define-key key-translation-map (kbd (format "M-[ 1 ; %d F" x)) (kbd (format "%s<end>" tkey)))
      ;; page up
      (define-key key-translation-map (kbd (format "M-[ 5 ; %d ~" x)) (kbd (format "%s<prior>" tkey)))
      ;; page down
      (define-key key-translation-map (kbd (format "M-[ 6 ; %d ~" x)) (kbd (format "%s<next>" tkey)))
      ;; insert
      (define-key key-translation-map (kbd (format "M-[ 2 ; %d ~" x)) (kbd (format "%s<delete>" tkey)))
      ;; delete
      (define-key key-translation-map (kbd (format "M-[ 3 ; %d ~" x)) (kbd (format "%s<delete>" tkey)))
      ;; f1
      (define-key key-translation-map (kbd (format "M-[ 1 ; %d P" x)) (kbd (format "%s<f1>" tkey)))
      ;; f2
      (define-key key-translation-map (kbd (format "M-[ 1 ; %d Q" x)) (kbd (format "%s<f2>" tkey)))
      ;; f3
      (define-key key-translation-map (kbd (format "M-[ 1 ; %d R" x)) (kbd (format "%s<f3>" tkey)))
      ;; f4
      (define-key key-translation-map (kbd (format "M-[ 1 ; %d S" x)) (kbd (format "%s<f4>" tkey)))
      ;; f5
      (define-key key-translation-map (kbd (format "M-[ 15 ; %d ~" x)) (kbd (format "%s<f5>" tkey)))
      ;; f6
      (define-key key-translation-map (kbd (format "M-[ 17 ; %d ~" x)) (kbd (format "%s<f6>" tkey)))
      ;; f7
      (define-key key-translation-map (kbd (format "M-[ 18 ; %d ~" x)) (kbd (format "%s<f7>" tkey)))
      ;; f8
      (define-key key-translation-map (kbd (format "M-[ 19 ; %d ~" x)) (kbd (format "%s<f8>" tkey)))
      ;; f9
      (define-key key-translation-map (kbd (format "M-[ 20 ; %d ~" x)) (kbd (format "%s<f9>" tkey)))
      ;; f10
      (define-key key-translation-map (kbd (format "M-[ 21 ; %d ~" x)) (kbd (format "%s<f10>" tkey)))
      ;; f11
      (define-key key-translation-map (kbd (format "M-[ 23 ; %d ~" x)) (kbd (format "%s<f11>" tkey)))
      ;; f12
      (define-key key-translation-map (kbd (format "M-[ 24 ; %d ~" x)) (kbd (format "%s<f12>" tkey)))
      ;; f13
      (define-key key-translation-map (kbd (format "M-[ 25 ; %d ~" x)) (kbd (format "%s<f13>" tkey)))
      ;; f14
      (define-key key-translation-map (kbd (format "M-[ 26 ; %d ~" x)) (kbd (format "%s<f14>" tkey)))
      ;; f15
      (define-key key-translation-map (kbd (format "M-[ 28 ; %d ~" x)) (kbd (format "%s<f15>" tkey)))
      ;; f16
      (define-key key-translation-map (kbd (format "M-[ 29 ; %d ~" x)) (kbd (format "%s<f16>" tkey)))
      ;; f17
      (define-key key-translation-map (kbd (format "M-[ 31 ; %d ~" x)) (kbd (format "%s<f17>" tkey)))
      ;; f18
      (define-key key-translation-map (kbd (format "M-[ 32 ; %d ~" x)) (kbd (format "%s<f18>" tkey)))
      ;; f19
      (define-key key-translation-map (kbd (format "M-[ 33 ; %d ~" x)) (kbd (format "%s<f19>" tkey)))
      ;; f20
      (define-key key-translation-map (kbd (format "M-[ 34 ; %d ~" x)) (kbd (format "%s<f20>" tkey)))

      (setq x (+ x 1))
      ))
    )
  )      

Mam też swoje rozwiązanie na wiki archlinux


komentarz pozostawiony przez @JeffKlukas: „Odpowiedź ukośna jest właśnie tym, czego potrzebowałem, aby działało to również za pośrednictwem PuTTY na Windowsie (nie mam reputacji, aby dodawać to jako komentarz, więc udzielam odpowiedzi zamiast tego). Kiedy włączyłem opcja xterm-keys w tmux, Shift-arrow produkowałaby tekst emacs jak 2C. Dodając powyższy kod elisp do mojego init.el, otrzymuję oczekiwaną funkcjonalność (szczególnie przydatną w trybie org). "
slm

1

FAQ tmux zawierał następujący wpis :

Jak sprawić, by klawisze Ctrl i Shift działały w emacsie?

The terminal-init-screenFunkcja w term/screen.elnazywa nowych ramek, ale nie konfiguruje żadnych przycisków funkcyjnych.

Jeśli włączona xterm-keysjest opcja tmux , wystarczy zdefiniować te same klucze, co xterm. Dodaj do tego init.ellub .emacswykonaj następujące czynności:

(defadvice terminal-init-screen
  ;; The advice is named `tmux', and is run before `terminal-init-screen' runs.
  (before tmux activate)
  ;; Docstring.  This describes the advice and is made available inside emacs;
  ;; for example when doing C-h f terminal-init-screen RET
  "Apply xterm keymap, allowing use of keys passed through tmux."
  ;; This is the elisp code that is run before `terminal-init-screen'.
  (if (getenv "TMUX")
    (let ((map (copy-keymap xterm-function-map)))
    (set-keymap-parent map (keymap-parent input-decode-map))
    (set-keymap-parent input-decode-map map))))

I upewnij się, że .tmux.confzawiera „ set -g xterm-keys on”.

Alternatywnie screen.elplik można skopiować na ścieżkę ładowania i dostosować.

Otworzyłem problem Tmux nr 1349, aby poprosić o przywrócenie wpisu FAQ.


0

Zasadniczo takie problemy występują z powodu niedopasowania między tym, co wysyła emulator terminala, a tym, czego oczekuje aplikacja kliencka.

Różne emulatory terminali mają różny stopień dostosowania, dlatego konieczne jest zapoznanie się z dostrajaniem emulacji danego.

Aplikacje klienckie zależą od wartości, $TERMktóra służy do wyszukiwania możliwości terminalu (emulatora) w bazie danych terminfo(lub termcap).

W twoim przypadku twoje powiązania emacsa używają w ten sposób jawnych sekwencji, $TERMa terminfo nie ma znaczenia: oczekiwany jest konkretny emulator terminala - jak już się zorientowałeś - xtermkompatybilny.


Zobacz Fix Terminals - Proszę o propozycję standaryzacji niektórych z tych różnic / braków w danych wejściowych terminala. Został podniesiony na iterm2-dyskusji, ale nie sądzę, żeby ktokolwiek jeszcze go zaimplementował.
ephemient
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.