我最近开始使用 tmux(之前是一个屏幕用户)并且我很喜欢它,除了一个小问题。我在 tmux 会话中使用 emacs,我习惯于使用 Shift-箭头键在 emacs 窗口(不是 tmux 窗口)之间移动。在 tmux 中运行时,这些绑定似乎完全停止工作(就像它们根本没有注册到 emacs 一样)。如果我退出 tmux 并在我的 shell 中运行 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)
Run Code Online (Sandbox Code Playgroud)
当不在 tmux 中运行时,我可以通过在 emacs 中执行 Cq 然后按下键序列来确认这些是 shift-arrow 键组合的正确字符序列。在 tmux 中,即使这样也不起作用,因为它似乎没有看到来自 shift-arrow 按键的任何输入(它只是位于 Cq 提示符处)。
查看 tmux 的键绑定,我不认为任何东西都绑定到 Shift-箭头键,即使是,它们也只会在输入前缀后注册(在我的情况下绑定到 Co)。
关于如何在 tmux 中使 shift-arrow 键再次工作的任何想法?
Chr*_*sen 13
首先,确保您的 TERM 在每个位置都是正确的:
xterm
-xterm-256color
在iTerm2窗口中运行的本地 shell 中的东西(例如)xterm
- SSH 连接到 Linux 系统后你的 shell 里面的东西screen
-在 Linux 系统screen-256color
上在tmux下运行的 shell 中的东西(例如)screen
在tmux 中使用基于-based的 TERM 。在tmuxxterm
之外立即使用TERM将允许tmux识别修改后的箭头键,但除非您还打开了其窗口选项,否则它不会通过它们。把它放在你的 Linux 系统上:xterm-keys
~/.tmux.conf
set-window-option -g xterm-keys on
Run Code Online (Sandbox Code Playgroud)
移位键的序列现在应该通过tmux运行到Emacs,通过 SSH 连接,在iTerm2窗口内。
小智 6
首先,您必须xterm-keys
在 tmux 配置中启用。所以把下面的~/.tmux.conf
setw -g xterm-keys on
Run Code Online (Sandbox Code Playgroud)
但是,这会破坏其他组合键。要修复它们,请将以下内容放入您的~/.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))
))
)
)
Run Code Online (Sandbox Code Playgroud)
我也在archlinux wiki 中有我的解决方案
一般情况下,出现此类问题的原因是终端仿真器发送的内容与客户端应用程序期望的内容不匹配。
不同的终端仿真器具有不同程度的可定制性,因此熟悉特定终端仿真器的仿真可调参数是必要的。
客户端应用程序取决于用于在(或)数据库$TERM
中查找终端(模拟器)功能的值。terminfo
termcap
在您的情况下,您的 emacs 绑定使用显式序列,因此$TERM
和 terminfo 无关:需要一个特定的终端模拟器 - 正如您已经想到的,一个xterm
兼容的终端模拟器。