Shift-Pfeil funktioniert nicht in Emacs innerhalb von tmux


26

Ich habe vor kurzem angefangen, tmux zu verwenden (war vorher ein Bildschirmbenutzer) und ich liebe es, bis auf ein kleines Problem. Ich benutze Emacs in meiner tmux-Sitzung und bin es gewohnt, mit den Umschalt-Pfeiltasten zwischen Emacs-Fenstern zu wechseln (nicht zwischen tmux-Fenstern). Unter tmux scheinen diese Bindungen nicht mehr zu funktionieren (es ist, als würden sie sich überhaupt nicht bei Emacs registrieren). Wenn ich tmux beende und nur Emacs in meiner Shell starte, funktionieren sie einwandfrei.

Ich benutze iTerm2, ssh'd in eine Linux-Box, tmux / emacs läuft dort. In meinen .emacs sind die Umschalt-Pfeiltasten wie folgt eingerichtet:

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

Wenn ich nicht in tmux laufe, kann ich bestätigen, dass dies die richtigen Zeichenfolgen für die Umschalt-Pfeil-Tastenkombinationen sind, indem ich Cq in Emacs mache und dann die Tastenfolge drücke. In tmux funktioniert das auch nicht, weil es keine Eingaben durch Drücken der Umschalt-Pfeiltaste zu sehen scheint (es befindet sich nur an der Cq-Eingabeaufforderung).

Wenn ich mir die Tastenkombinationen für tmux anschaue, glaube ich nicht, dass irgendetwas an Shift-Pfeiltasten gebunden ist, und selbst wenn dies der Fall wäre, würden sie sich erst nach Eingabe des Präfixes (das in meinem Fall an Co gebunden ist) registrieren.

Hast du eine Idee, wie die Shift-Pfeiltasten in tmux wieder funktionieren sollen?


1
Ich habe die Antwort selbst gefunden, aber StackExchange lässt mich meine Frage erst nach weiteren sieben Stunden offiziell beantworten, da ich noch nicht genug Ruf habe. Wie auch immer, wenn jemand daran interessiert ist, scheint es das Problem zu beheben, wenn man die Option set-window-option xterm-keys aktiviert. Ich habe dies als globale Option festgelegt, indem ich dies in meine .tmux.conf-Datei eingefügt habe, und ich bin wieder im Geschäft: set-window-option -g xterm-keys on
triangle_man

Versuchen Sie abzustimmen, um die Frage zu schließen, wenn Sie es wirklich nicht können
Eir Nym

Antworten:


13

Stellen Sie zunächst sicher, dass Ihr TERM an jedem Ort korrekt ist:

  • xterm-Etwas (zB xterm-256color) in Ihrer lokalen Shell, das in Ihrem iTerm2- Fenster ausgeführt wird
  • xterm-etwas in Ihrer Shell nach dem SSH-Wechsel zum Linux-System
    Dies sollte dasselbe sein wie das, was Sie lokal in iTerm2 verwenden , da SSH es an die Remote-Seite weiterleiten sollte (und vor allem sollte die Remote-Seite das nicht blind überschreiben Wert in einer Shell-Initialisierungsdatei).
  • screen-etwas (z. B. screen-256color) in Ihrer Shell, das unter tmux auf dem Linux-System ausgeführt wird
    Sie sollten screenin tmux immer einen -basierten TERM verwenden .

Eine Having xtermTERM unmittelbar außerhalb tmux ermöglicht tmux die modifizierte Pfeiltasten zu erkennen, aber es wird ihnen nicht passieren , wenn Sie auch die haben xterm-keysauf Fenster Option eingeschaltet. Fügen Sie dies in Ihr ~/.tmux.confLinux-System ein:

set-window-option -g xterm-keys on

Die Sequenzen für die verschobenen Tasten sollten nun zu Emacs gelangen , der in tmux über eine SSH-Verbindung in einem iTerm2- Fenster ausgeführt wird.


Genau das brauchte ich, um textadept in tmux zu verwenden.
William Hilton

1
Diese Lösung hat bei mir nicht funktioniert. Ich bin auf Fedora-23 und benutze ein Gnome-Terminal. Meine TERMs und .tmux.conf werden wie in der Antwort beschrieben eingestellt. Das Einstellen der Bindungen wie in der Frage beschrieben funktioniert jedoch. Ich würde dieses Rätsel wirklich gerne lösen, da es auch eine Ncurses-App vermasselt, an der ich arbeite.
Gogators

1
@ Gogatoren hier gleich; Die obige Lösung funktioniert bei mir nicht, obwohl ich genau das hatte, was vorgeschlagen wurde.
Fingolfin

Strg + Umschalttaste funktioniert nicht, Strg + <f #> funktioniert nicht und so weiter. STRG + D funktioniert jedoch.
16.

In der Praxis bedeutet dies: export XTERM=xterm-256color(Ich schreibe dies, weil ich nicht wusste, was "Ihr BEGRIFF" in der Antwort bedeutet. Ich suchte nach einem Kommentar, der erklärt, dass ... es keinen gab und jetzt gibt es einen.)
jhegedus

3

Zuerst müssen Sie xterm-keysin Ihrer tmux-Konfiguration aktivieren. Geben Sie also Folgendes ein~/.tmux.conf

setw -g xterm-keys on

Dies kann jedoch zu Problemen mit anderen Tastenkombinationen führen. Um sie zu beheben, fügen Sie Folgendes in Ihre ~/.emacsoder ~/.emacs.d/init.elKonfiguration ein

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

Auch ich habe meine Lösung im Archlinux-Wiki


Kommentar hinterlassen von @JeffKlukas: "Die Antwort von oblique war genau das, was ich brauchte, um PuTTY auch unter Windows zum Laufen zu bringen (ich habe nicht den Ruf, dies als Kommentar hinzuzufügen, also stattdessen eine Antwort zu geben) Mit der Option xterm-keys in tmux würde Shift-arrow in Emacs Text wie 2C erzeugen. Durch Hinzufügen des obigen Elisp-Codes zu meinem init.el erhalte ich die erwartete Funktionalität (besonders nützlich im org-Modus). "
SLM

1

Die tmux-FAQ enthielten den folgenden Eintrag :

Wie mache ich Strg- und Shift-Pfeiltasten in Emacs?

Die terminal-init-screenFunktion in term/screen.elwird für neue Frames aufgerufen, konfiguriert jedoch keine Funktionstasten.

Wenn die xterm-keysOption tmux aktiviert ist, ist es ausreichend, dieselben Schlüssel wie xterm zu definieren. Fügen Sie dazu init.eloder Folgendes hinzu .emacs:

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

Und stellen Sie sicher, .tmux.confenthält " set -g xterm-keys on".

Alternativ kann die screen.elDatei in den Ladepfad kopiert und angepasst werden.

Ich habe die tmux- Ausgabe Nr. 1349 geöffnet , um die Wiederherstellung für den FAQ-Eintrag anzufordern.


0

Im Allgemeinen treten solche Probleme auf, weil die vom Terminalemulator gesendeten Daten nicht mit den von der Clientanwendung erwarteten Daten übereinstimmen.

Verschiedene Terminalemulatoren sind unterschiedlich anpassbar. Daher ist es erforderlich, sich mit den Emulations-Tunables eines bestimmten Terminals vertraut zu machen.

Clientanwendungen hängen von dem Wert ab, mit $TERMdem die Funktionen des Terminals (Emulators) in der terminfo(oder termcap) Datenbank gesucht werden.

In Ihrem Fall verwenden Ihre Emacs-Bindungen daher explizite Sequenzen, $TERMund terminfo ist irrelevant: Es wird ein bestimmter Terminal-Emulator erwartet - wie Sie bereits herausgefunden haben, ein xterm-kompatibler.


Siehe Fix Terminals - Bitte um einen Vorschlag zur Standardisierung einiger dieser Unterschiede / Mängel bei der Terminal-Eingabe. Es wurde auf iterm2-discussion angesprochen, aber ich glaube noch nicht, dass jemand es implementiert hat.
ephemient
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.