Maiusc-freccia non funziona in emacs all'interno di tmux


26

Di recente ho iniziato a utilizzare tmux (prima era un utente dello schermo) e lo adoro, tranne per un piccolo problema. Uso emacs nella mia sessione di tmux e sono abituato a usare i tasti freccia Maiusc per spostarmi tra le finestre di emacs (non le finestre di tmux). Quando si esegue in tmux, questi collegamenti sembrano smettere di funzionare del tutto (è come se non si registrassero affatto su emacs). Se esco da tmux e eseguo solo emacs nella mia shell, funzionano bene.

Sto usando iTerm2, ssh'd in un box Linux, eseguendo tmux / emacs lì. Ho i tasti di scelta rapida Maiusc-freccia impostati come segue nei miei .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 non si esegue in tmux, posso confermare che sono le sequenze di caratteri giuste per le combinazioni di tasti Maiusc-Freccia facendo Cq in emacs e quindi premendo la sequenza di tasti. All'interno di tmux, anche quello non funziona perché non sembra vedere alcun input dal tasto freccia MAIUSC (si trova solo al prompt Cq).

Osservando le combinazioni di tasti per tmux, non penso che nulla sia legato ai tasti freccia MAIUSC e anche se lo fosse, si registrerebbero solo dopo aver inserito il prefisso (che nel mio caso è associato a Co).

Qualche idea su come far funzionare nuovamente i tasti freccia Maiusc all'interno di tmux?


1
In realtà ho trovato la risposta da solo, ma StackExchange non mi consente di rispondere ufficialmente alla mia domanda per altre 7 ore poiché non ho ancora abbastanza reputazione. Comunque se qualcuno è interessato, fare set-window-option xterm-keys su sembra risolverlo. Ho impostato questo come un'opzione globale inserendolo nel mio .tmux.conf e mi sembra di essere tornato al lavoro: set-window-option -g xterm-keys on
triangle_man

Se non ci riesci, prova a votare per chiudere la domanda
Eir Nym,

Risposte:


13

Innanzitutto, assicurati che il tuo TERM sia corretto in ogni posizione:

  • xterm-qualcosa (ad es. xterm-256color) all'interno della shell locale in esecuzione nella finestra iTerm2
  • xterm-qualcosa all'interno della tua shell dopo SSHing sul sistema Linux
    Questo dovrebbe essere lo stesso di qualsiasi cosa tu stia usando localmente in iTerm2 , dal momento che SSH dovrebbe passarlo lungo al lato remoto (e, soprattutto, il lato remoto non dovrebbe ignorare ciecamente il valore in un file di inizializzazione della shell).
  • screen-qualcosa (es. screen-256color) all'interno della shell in esecuzione su tmux sul sistema Linux
    Dovresti sempre usare un screenTERM basato su tmux .

Avere un xtermTERM immediatamente fuori da tmux consentirà a tmux di riconoscere i tasti freccia modificati, ma non li passerà attraverso a meno che tu non abbia anche l' xterm-keysopzione della finestra attivata. Metti questo nel tuo ~/.tmux.confsistema Linux:

set-window-option -g xterm-keys on

Le sequenze per i tasti spostati dovrebbero ora passare a Emacs , eseguendo tmux , attraverso una connessione SSH, all'interno di una finestra iTerm2 .


Questo è esattamente ciò di cui avevo bisogno per usare textadept in tmux.
William Hilton,

1
Questa soluzione non ha funzionato per me. Sono su Fedora-23 usando un terminale gnome. My TERM's e .tmux.conf sono impostati come descritto nella risposta. L'impostazione delle associazioni come descritto nella domanda funziona comunque. Mi piacerebbe davvero risolvere questo mistero dal momento che sta inventando anche un'app ncurses su cui sto lavorando.
Gogators,

1
@gogators stesso qui; la soluzione di cui sopra non funziona per me anche se avevo esattamente quello che mi è stato suggerito.
Fingolfin,

Ctrl + Maiusc non funziona, Ctrl + <f #> non funziona e così via. Ctrl + d funziona però.
av

In pratica questo significa: export XTERM=xterm-256color(sto scrivendo questo perché non sapevo cosa significhi "il tuo TERMINE" nella risposta, stavo cercando un commento che spiegasse che ... non ce
n'era

3

Per prima cosa devi abilitare xterm-keysnella tua configurazione di tmux. Quindi inserisci quanto segue~/.tmux.conf

setw -g xterm-keys on

Ma questo romperà altre combinazioni di tasti. Per risolverli, inserisci quanto segue nel tuo ~/.emacso nella tua ~/.emacs.d/init.elconfigurazione

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

Inoltre ho la mia soluzione nel wiki di archlinux


commento lasciato da @JeffKlukas: "la risposta di oblique è proprio quello di cui avevo bisogno per farlo funzionare anche con PuTTY su Windows (non ho la reputazione di aggiungere questo come commento, quindi fare una risposta). Quando ho attivato l'opzione xterm-keys in tmux, Maiusc-freccia produrrebbe testo come 2C in emacs. Aggiungendo il codice elisp sopra riportato a init.el, ottengo la funzionalità prevista (particolarmente utile in modalità org). "
slm

1

Le FAQ di tmux utilizzate per contenere la seguente voce :

Come faccio a far funzionare i tasti freccia ctrl e shift in emacs?

La terminal-init-screenfunzione in term/screen.elviene chiamata per nuovi frame, ma non configura alcun tasto funzione.

Se l' xterm-keysopzione tmux è attiva, è sufficiente definire gli stessi tasti di xterm. Aggiungi quanto segue a init.elo .emacsper fare questo:

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

E assicurati che .tmux.confcontenga " set -g xterm-keys on".

In alternativa, il screen.elfile può essere copiato nel percorso di caricamento e personalizzato.

Ho aperto il numero # 1349 di tmux per richiedere il ripristino per la voce FAQ.


0

In generale, problemi come questo si verificano a causa della mancata corrispondenza tra ciò che l'emulatore di terminale invia e ciò che l'applicazione client si aspetta.

Diversi emulatori di terminali hanno un diverso grado di personalizzazione, quindi è necessario familiarizzare con le regolazioni dell'emulazione di un particolare.

Le applicazioni client dipendono dal valore $TERMutilizzato per cercare le capacità del terminale (emulatore) nel database terminfo(o termcap).

Nel tuo caso, i tuoi collegamenti emacs usano sequenze esplicite quindi $TERMe terminfo sono irrilevanti: è previsto un emulatore di terminale specifico - come hai già capito, xtermcompatibile.


Vedi Terminali fissi - Per una proposta di standardizzazione di alcune di queste differenze / carenze nell'input dei terminali. È stato sollevato su iterm2-discuss ma non credo che nessuno l'abbia ancora implementato.
effimero
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.