Shift-arrow no funciona en emacs dentro de tmux

26

Recientemente comencé a usar tmux (era un usuario de pantalla antes) y me encanta, excepto por un pequeño problema. Uso emacs dentro de mi sesión de tmux y estoy acostumbrado a usar las teclas de flecha Shift para moverme entre las ventanas de emacs (no las ventanas de tmux). Cuando se ejecuta dentro de tmux, estos enlaces parecen dejar de funcionar por completo (es como si no se registraran en emacs). Si salgo de tmux y solo ejecuto emacs en mi shell, funcionan bien.

Estoy usando iTerm2, ssh'd en una caja de Linux, ejecutando tmux / emacs allí. Tengo las combinaciones de teclas Shift-arrow configuradas de la siguiente manera en mis .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)

Cuando no se ejecuta en tmux, puedo confirmar que esas son las secuencias de caracteres correctas para las combinaciones de teclas de flecha de desplazamiento haciendo Cq en emacs y luego presionando la secuencia de teclas. Dentro de tmux, incluso eso no funciona porque no parece ver ninguna entrada de la pulsación de la tecla Mayús (solo se encuentra en el indicador Cq).

Mirando las combinaciones de teclas para tmux, no creo que nada esté vinculado a las teclas de flecha Mayúsculas e incluso si fuera así, solo se registrarían después de ingresar el prefijo (que en mi caso está vinculado a Co).

¿Alguna idea sobre cómo hacer que las teclas de flecha de desplazamiento funcionen nuevamente dentro de tmux?

triangulo_man
fuente
1
En realidad, encontré la respuesta, pero StackExchange no me deja responder oficialmente mi propia pregunta durante otras 7 horas, ya que todavía no tengo suficiente reputación. De todos modos, si alguien está interesado, al hacer set-window-option xterm-keys parece solucionarlo. Configuré esto como una opción global al poner esto en mi .tmux.conf y parece que estoy de vuelta en el negocio: set-window-option -g xterm-keys on
triangle_man
Intenta votar para cerrar la pregunta si realmente no puedes
Eir Nym

Respuestas:

13

Primero, asegúrese de que su TÉRMINO sea correcto en cada ubicación:

  • xterm-algo (por ejemplo xterm-256color) dentro de su shell local que se ejecuta en su ventana iTerm2
  • xterm-algo dentro de su shell después de SSHing al sistema Linux
    Esto debería ser lo mismo que lo que esté usando localmente en iTerm2 , ya que SSH debería pasarlo al lado remoto (y, lo que es más importante, el lado remoto no debe anular ciegamente el valor en un archivo de inicialización de shell).
  • screen-algo (p screen-256color. ej. ) dentro de su shell que se ejecuta bajo tmux en el sistema Linux
    Siempre debe usar un screenTERM basado en tmux .

Tener un xtermTERM inmediatamente fuera de tmux permitirá que tmux reconozca las teclas de flecha modificadas, pero no las pasará a menos que también tenga xterm-keysactivada su opción de ventana. Pon esto en tu ~/.tmux.confsistema Linux:

set-window-option -g xterm-keys on

Las secuencias para las teclas desplazadas ahora deberían pasar a Emacs , ejecutándose dentro de tmux , a través de una conexión SSH, dentro de una ventana iTerm2 .

Chris Johnsen
fuente
Esto es exactamente lo que necesitaba para usar textadept en tmux.
William Hilton
1
Esta solución no me funcionó. Estoy en Fedora-23 usando un gnome-terminal. Mis TERM y .tmux.conf se configuran como se describe en la respuesta. Sin embargo, establecer los enlaces como se describe en la pregunta funciona. Realmente me gustaría resolver este misterio ya que también está arruinando una aplicación ncurses en la que estoy trabajando.
Gogators
1
@gogators lo mismo aquí; la solución anterior no me funciona a pesar de que tenía exactamente lo que se sugirió.
Fingolfin
Ctrl + Shift no funciona, Ctrl + <f #> no funciona y así sucesivamente. Sin embargo, Ctrl + d funciona.
avp
En la práctica, esto significa: export XTERM=xterm-256color(Estoy escribiendo esto porque no sabía qué significa "su TÉRMINO" en la respuesta, estaba buscando un comentario que explicara que ... no había ninguno, y ahora hay uno.)
jhegedus
3

Primero debe habilitar xterm-keysen su configuración tmux. Así que pon lo siguiente en~/.tmux.conf

setw -g xterm-keys on

Pero, esto romperá otras combinaciones de teclas. Para solucionarlos, ponga lo siguiente en su ~/.emacso ~/.emacs.d/init.elconfig

;; 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))
      ))
    )
  )      

También tengo mi solución en archlinux wiki

oblicuo
fuente
comentario dejado por @JeffKlukas: "la respuesta oblicua es justo lo que necesitaba para que esto funcionara también a través de PuTTY en Windows (no tengo la reputación de agregar esto como un comentario, así que respondí). Cuando encendí la opción xterm-keys en tmux, Shift-arrow produciría texto como 2C en emacs. Al agregar el código elisp anterior a mi init.el, obtengo la funcionalidad esperada (especialmente útil en modo org) ".
slm
1

Las preguntas frecuentes de tmux solían contener la siguiente entrada :

¿Cómo hago que las teclas Ctrl y Mayúsculas funcionen en emacs?

La terminal-init-screenfunción en term/screen.else llama para nuevos marcos, pero no configura ninguna tecla de función.

Si la xterm-keysopción tmux está activada, es suficiente definir las mismas claves que xterm. Agregue lo siguiente a init.elo .emacspara hacer esto:

(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))))

Y asegúrese de que .tmux.confcontenga " set -g xterm-keys on".

Alternativamente, el screen.elarchivo puede copiarse en la ruta de carga y personalizarse.

Abrí el problema tmux # 1349 para solicitar la restauración de la entrada de preguntas frecuentes.

sorsasampo
fuente
0

En general, problemas como este ocurren debido a una falta de correspondencia entre lo que envía el emulador de terminal y lo que espera la aplicación del cliente.

Los diferentes emuladores de terminal tienen diferentes grados de personalización, por lo que es necesario familiarizarse con los ajustes de emulación de uno en particular.

Las aplicaciones del cliente dependen del valor $TERMque se usa para buscar las capacidades del terminal (emulador) en la terminfo(o termcap) base de datos.

En su caso, sus enlaces emacs usan secuencias explícitas por lo tanto $TERMy terminfo son irrelevantes: se espera un emulador de terminal específico, como ya descubrió, xtermuno compatible.

yrk
fuente
Consulte Arreglar terminales: consulte la propuesta para estandarizar algunas de estas diferencias / deficiencias en la entrada del terminal. Se ha planteado en iterm2-debate pero no creo que nadie lo haya implementado todavía.
Ephemient