tmux内のemacsでShift-矢印が機能しない


26

私は最近、tmux(以前はスクリーンユーザーでした)の使用を開始しましたが、1つの小さな問題を除いて、それを愛しています。私はtmuxセッション内でemacsを使用しており、Shiftキーを押しながら矢印キーを使用してemacsウィンドウ間(tmuxウィンドウではない)を移動することに慣れています。tmux内で実行すると、これらのバインディングは完全に機能しなくなるようです(まったくemacsに登録しないようです)。tmuxを終了し、シェルでemacsを実行するだけで、うまく機能します。

LinuxボックスにsshされたiTerm2を使用して、そこでtmux / emacsを実行しています。.emacsで次のようにShiftキーと矢印キーのバインドを設定しています。

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

tmuxで実行していないときは、emacsでCqを実行してからキーシーケンスを押すことで、これらがShiftキーと矢印キーの組み合わせに適した文字シーケンスであることを確認できます。tmux内では、Shiftキーと矢印キーを押しても入力が表示されないように見えるため、それでも動作しません(Cqプロンプトに位置しています)。

tmuxのキーバインディングを見ると、Shiftキーと矢印キーにバインドされているものはないと思います。たとえそうであったとしても、プレフィックス(私の場合はCoにバインドされている)を入力した後にのみ登録されます。

シフト矢印キーをtmux内で再び機能させる方法に関するアイデアはありますか?


1
実際に自分で答えを見つけましたが、まだ十分な評判が得られていないため、StackExchangeでさらに7時間、公式に自分の質問に答えることはできません。とにかく誰かが興味を持っているなら、set-window-option xterm-keysを実行すると修正されるようです。これを.tmux.confに入れることでグローバルオプションとして設定し、ビジネスに戻ったようです。set-window-option -g xterm-keys on
triangle_man

本当にできない場合は質問に投票してみてください
Eir Nym

回答:


13

まず、各場所でTERMが正しいことを確認します。

  • xterm-something(例えばxterm-256color)あなたの地元のシェル内で、あなたの中で実行されているiTerm2の
  • xtermLinuxのシステムにSSHing後にシェルの内側に-something
    これは、あなたがローカルで使用しているものは何でも同じである必要がありiTerm2 SSHは、リモート側に沿って、それを渡すべきである(そして、重要なのは、リモート側が盲目的に上書きしてはならないため、シェル初期化ファイルの値)。
  • screen(例えば-something screen-256colorの下で実行しているシェルの内側)tmuxは Linuxシステム上で
    いつでも使うべきscreen内部のベースTERMをtmuxは

持っxtermTERMことはすぐに外tmuxのが可能になりますtmuxのキーの矢印に変更を認識し、それはあなたがまた、その持っていない限り介してそれらを通過しないxterm-keysウィンドウオプションがオン。~/.tmux.confLinuxシステムでこれを配置します。

set-window-option -g xterm-keys on

シフトされたキーのシーケンスは、tmux内で実行され、iTerm2ウィンドウ内でSSH接続を介して実行されるEmacs到達するはずです。


これは、tmuxでtextadeptを使用するために必要なものです。
ウィリアムヒルトン

1
この解決策はうまくいきませんでした。私はgnome-terminalを使用してFedora-23にいます。私のTERMと.tmux.confは、答えで説明されているように設定されています。ただし、質問で説明されているようにバインディングを設定しても機能します。このミステリーを解決したいのは、私が取り組んでいるncursesアプリも台無しにしているからです。
-gogators

1
同じ@gogators。上記の解決策は、提案されたとおりのものを持っていたとしても機能しません。
フィンゴルフィン

Ctrl + Shiftは機能せず、Ctrl + <f#>は機能しません。ただし、Ctrl + dは機能します。
avp

この手段は実際には:export XTERM=xterm-256color(私は、私はそれを説明するコメントを探していた答え手段でどのような「あなたのTERM」知らなかった私becasueこれを書いています...何もありませんでした、そして今ものがある。)
jhegedusの

3

まずxterm-keys、tmux構成で有効にする必要があります。だから次を入れて~/.tmux.conf

setw -g xterm-keys on

しかし、これは他のキーの組み合わせを壊します。それらを修正するには、あなたの~/.emacsまたは~/.emacs.d/init.el設定に以下を入れてください

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

また、archlinux wikiにソリューションがあります


@JeffKlukasが残したコメント:「斜めの答えは、WindowsのPuTTYでもこれを機能させるために必要なものです(これをコメントとして追加する評判はないので、代わりに答えを作成します。) tmuxのxterm-keysオプション、Shift-arrowはemacsで2Cのようなテキストを生成します。上記のelispコードをinit.elに追加することで、期待どおりの機能が得られます(特にorgモードで役立ちます)。
slm

1

tmux FAQ には、次のエントリが含まれていました

EmacsでCtrlキーとShiftキーを機能させるにはどうすればよいですか?

terminal-init-screen関数は、term/screen.el新しいフレームのために呼ばれているが、それは任意のファンクションキーを設定していません。

tmux xterm-keysオプションがオンの場合、xtermと同じキーを定義するだけで十分です。以下を追加init.elまたは追加します.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))))

また、.tmux.confset -g xterm-keys on」が含まれていることを確認してください。

または、screen.elファイルをロードパスにコピーしてカスタマイズすることもできます。

FAQエントリの復元を要求するために、tmux issue#1349を開きました。


0

一般的なケースでは、ターミナルエミュレータが送信するものとクライアントアプリケーションが期待するものとのミスマッチのために、このような問題が発生します。

ターミナルエミュレータごとにカスタマイズの度合いが異なるため、特定のエミュレータのエミュレーション調整パラメータに慣れる必要があります。

クライアントアプリケーション$TERMは、terminfo(またはtermcap)データベースで端末(エミュレータ)の機能を検索するために使用される値に依存します。

あなたの場合、emacsバインディングは明示的なシーケンスを使用するため$TERM、terminfoは無関係です。特定のターミナルエミュレータが必要です-既にわかっているように、xterm互換性のあるものです。


端末の修正-端末入力のこれらの違い/欠陥のいくつかを標準化する提案については、こちらをご覧ください。それはされていますiterm2-議論で育ったが、私は誰のはまだそれを実装しないと思います。
一時的な
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.