Shift-arrow não está funcionando no emacs dentro do tmux

26

Recentemente, comecei a usar o tmux (era um usuário de tela antes) e estou adorando, exceto por um pequeno problema. Eu uso o emacs dentro da minha sessão do tmux e estou acostumado a usar as teclas de seta Shift para mover entre as janelas do emacs (não as janelas do tmux). Quando rodando dentro do tmux, estas ligações parecem parar de funcionar inteiramente (é como se elas não se registrassem no emacs). Se eu sair do tmux e apenas executar o emacs no meu shell, eles funcionarão bem.

Estou usando o iTerm2, ssh'd em uma caixa Linux, rodando o tmux / emacs lá. Eu tenho as ligações de teclas de seta de Shift configuradas da seguinte maneira em meus .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)

Quando não estou rodando no tmux, eu posso confirmar que estas são as sequências de caracteres certas para as combinações de teclas de seta de deslocamento, fazendo C-q no emacs e pressionando a sequência de teclas. Dentro do tmux, mesmo que não funcione, porque não parece ver nenhuma entrada da tecla de seta de deslocamento (apenas fica no prompt do C-q).

Olhando para os atalhos de teclado do tmux, acho que nada está vinculado às teclas Shift-arrow e, mesmo que fosse, eles só se registrariam depois de digitar o prefixo (que é vinculado ao C-o no meu caso).

Alguma idéia de como fazer com que as teclas shift-arrow funcionem novamente dentro do tmux?

    
por triangle_man 11.11.2011 / 19:08

4 respostas

13

Primeiro, verifique se o seu TERM está correto em cada local:

  • xterm -something (por exemplo, xterm-256color ) dentro do seu shell local em execução na sua janela iTerm2
  • xterm -alguma coisa dentro do seu shell após o SSHing para o sistema Linux
    Isto deve ser o mesmo que você está usando localmente em iTerm2 , já que o SSH deve estar passando para o lado remoto (e, mais importante, o lado remoto não deve estar cegamente substituindo o valor em um shell arquivo de inicialização).
  • screen -something (por exemplo, screen-256color ) dentro do seu shell executado em tmux no sistema Linux
    Você deve sempre usar um termo screen -based dentro do tmux .

Ter um xterm TERM imediatamente fora tmux permitirá que o tmux reconheça as teclas de seta modificadas, mas não as passará, a menos que você também tenha seu xterm-keys opção de janela ativada. Coloque isso no seu ~/.tmux.conf no sistema Linux:

set-window-option -g xterm-keys on

As sequências para as teclas deslocadas devem agora passar para o Emacs , rodando dentro do tmux , através de uma conexão SSH, dentro de um iTerm2 janela.

    
por 19.03.2012 / 05:42
3

Primeiro você deve ativar xterm-keys na sua configuração do tmux. Então coloque o seguinte em ~/.tmux.conf

setw -g xterm-keys on

Mas isso quebrará outras combinações de teclas. Para corrigi-los, coloque o seguinte no seu ~/.emacs ou ~/.emacs.d/init.el config

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

Também tenho minha solução em wiki do archlinux

    
por 29.05.2013 / 01:51
1

FAQ do tmux usado para conter a seguinte entrada :

How do I make ctrl and shift arrow keys work in emacs?

The terminal-init-screen function in term/screen.el is called for new frames, but it doesn't configure any function keys.

If the tmux xterm-keys option is on, it is enough to define the same keys as xterm. Add the following to init.el or .emacs to do this:

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

And ensure .tmux.conf contains "set -g xterm-keys on".

Alternatively, the screen.el file can be copied to the load path and customized.

Eu abri o tmux número 1349 para solicitar a restauração para a entrada da FAQ.

    
por 20.05.2018 / 09:04
0

No caso geral, problemas como este acontecem por causa do mistmatch entre o que o emulador de terminal envia e o que o aplicativo cliente espera.

Diferentes emuladores de terminal têm diferentes graus de personalização, por isso é necessário familiarizar-se com sintonizadores de emulação de um determinado.

Os aplicativos clientes dependem do valor de $TERM , que é usado para os recursos do terminal de pesquisa (emulador) no banco de dados terminfo (ou termcap ).

No seu caso, suas ligações do emacs usam seqüências explícitas, portanto $TERM e terminfo são irrelevantes: um emulador de terminal específico é esperado - como você já descobriu, um xterm -compatível.

    
por 18.01.2012 / 19:25

Tags