如果我在终端中运行emacs(即用emacs -nw
在iTerm2中启动emacs)使用windmove
和它的默认绑定,我应该能够使用Shift
+→
←
↑
↓
的各种组合在窗口之间导航。此外,paredit
的绑定涉及Ctrl
/Meta
+→
←
CCD_12CDC_13↓
,这些都可以在elisp模式缓冲区中正常工作。
看起来箭头键功能依赖于emacs解码终端转义序列,通过(我认为)input-decode-map
然而,如果我将主模式设置为clojure-mode
,则转义序列的解码似乎被禁用(或覆盖)。当我执行这些绑定时,我只得到转义序列。
clojure-mode
中的绑定发生了什么情况?
版本:
- emacs 24.3.1(已尝试maxosxforemacs.com版本和自制程序)
- clojure模式20131117.2306(已尝试其他版本)
- OSX 10.8.5
- iTerm2 1.0.0.20131124
(免责声明:我在clojure模式中提出了这个问题,但没有解决方案)
更新2013/12/10:需要明确的是:这个问题是clojure-mode
特有的。iTerm+箭头键中的emacs -nw
在其他主要模式下工作良好。我肯定是我在做一些愚蠢的事情,我想知道是什么。
这里的设置几乎相同,但没有类似的问题。这是我无论如何都会做的。首先,在暂存缓冲区中评估以下emacs-lisp代码。
(progn
(define-key input-decode-map "e[1;2D" [S-left])
(define-key input-decode-map (kbd "M-[ 1 ; 2 C") [S-right])
(define-key input-decode-map (kbd "M-[ 1 ; 2 B")[S-down])
(define-key input-decode-map "e[1;2A" [S-up])
(define-key input-decode-map "e[1;6A" [S-C-up])
(define-key input-decode-map "e[1;6B" [S-C-down]))
当clojure模式被激活时,请尝试windmove绑定。如果这解决了您的问题,并且假设TERM环境变量设置为xterm-256color
,请在init.el
中放入以下内容
(if (equal "xterm-256color" (tty-type))
(progn
(define-key input-decode-map "e[1;2D" [S-left])
(define-key input-decode-map (kbd "M-[ 1 ; 2 C") [S-right])
(define-key input-decode-map (kbd "M-[ 1 ; 2 B")[S-down])
(define-key input-decode-map "e[1;2A" [S-up])
(define-key input-decode-map "e[1;6A" [S-C-up])
(define-key input-decode-map "e[1;6B" [S-C-down])))
希望这能有所帮助。
检查Iterm中的设置,更具体地说是"全局快捷键"。这些将优先于发送给emacs的内容。C-Shift-Arrow在Iterm中被用来切换标签,我相信它可能会干扰emacs。