emacsでCtrlキーとShift矢印キーを操作する方法は?

emacsでCtrlキーとShift矢印キーを操作する方法は?

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

私はiTerm2を使用しており、SSHを介してLinuxシステムに接続し、そこで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でShift - 矢印キーを再操作する方法についてのアイデアはありますか?

答え1

まず、すべての場所で用語が正しいことを確認してください。

  • xtermxterm-256color- ローカルシェルで実行されるもの(例)iTerm2
  • xterm- LinuxシステムにSSH接続した後のシェルの内容
    ローカルで使用するものと同じでなければなりません。iTerm2、SSHがこれをリモート側に渡す必要があるからです(そして重要なのは、リモート側がシェル初期化ファイルの値を盲目的に上書きしないことです)。
  • screenscreen-256color- シェル内部で実行されるもの(例:)マルチプレクサLinuxシステムでは、常に内部的にTERMを使用する必要が
    あります。screenマルチプレクサ

xtermすぐに屋外で1学期を過ごしてください。マルチプレクサ許可するマルチプレクサ変更された矢印キーを認識しますが、xterm-keysウィンドウオプションもオンになっていないと渡されません。~/.tmux.confLinuxシステムに入れてください。

set-window-option -g xterm-keys on

これでShiftキーの順序を渡す必要があります。Emacs、実行中マルチプレクサ、SSH経由で接続、iTerm2窓。

答え2

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

私にも私の解決策がありますアーチLinuxウィキ

答え3

ティモックスFAQ次の項目を含めるために使用されます。:

emacsでCtrlキーとShift矢印キーを操作する方法は?

terminal-init-screenの機能はterm/screen.el新しいフレームに対して呼び出されますが、ファンクションキーを設定しません。

tmuxxterm-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.conf含めてくださいset -g xterm-keys on

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

tmuxを開いた問題#1349FAQアイテムの復元をリクエストしてください。

答え4

一般に、この種の問題は、端末エミュレータが送信する内容がクライアント・アプリケーションが期待する内容と一致しないために発生します。

さまざまな端末エミュレータにはさまざまなレベルのカスタマイズ機能があるため、特定の端末エミュレータのエミュレーション調整可能パラメータに精通している必要があります。

クライアントアプリケーションは、データベースで端末(エミュレータ)機能を検索するために使用される値によって異なります$TERMterminfotermcap

あなたの場合、emacsバインディングは明示的なシーケンスを使用するので、$TERMterminfoとは関係ありません。特定の端末エミュレータが必要です。すでに知っているように、互換性のあるxterm端末エミュレータです。

関連情報