【问题标题】:Why don't Shift+arrow bindings work in clojure-mode in emacs terminal?为什么 Shift+箭头绑定在 emacs 终端的 clojure 模式下不起作用?
【发布时间】:2013-12-08 22:32:15
【问题描述】:

如果我在终端中运行 emacs(即在 iTerm2 中使用 emacs -nw 启动 emacs) 使用windmove 和它的默认绑定,我应该能够使用Shift + 的各种组合在窗口之间导航,另外paredit 具有涉及Ctrl/ 的绑定Meta + ,这些都可以在(比如)elisp 模式缓冲区中正常工作。

看起来箭头键功能依赖于 emacs 解码终端转义序列,通过(我认为)input-decode-map

但是,如果我将主要模式设置为clojure-mode,则转义序列的解码似乎被禁用(或覆盖)。当我执行这些绑定时,我只是得到了转义序列。

clojure-mode 中的绑定发生了什么?

版本:

  • emacs 24.3.1(已尝试 maxosxforemacs.com 版本和自制软件)
  • clojure-mode 20131117.2306(已尝试其他版本)
  • OSX 10.8.5
  • iTerm2 1.0.0.20131124

(免责声明:I raised this as an issue on clojure-mode, but no solution is forthcoming

2013/12/10 更新: 绝对清楚:这个问题是 clojure-mode 特有的。 iTerm + 箭头键中的emacs -nw 在其他主要模式下工作正常。我确定我正在做一些愚蠢的事情导致这种情况,我想知道是什么。

【问题讨论】:

  • emacs终端是什么意思?终端中的emacs?如果是,哪个模拟器? M-x describe-key 会告诉你哪个函数正在使用给定的绑定(并且会告诉你 keypress emacs 得到了什么,以防输入转换丢失的问题)。
  • 看看你上面的其他帖子,我想差异可能归结为 iterm 和 xterm 之间的不兼容。尝试在 screen 或 tmux 内运行 emacs,它们会拦截输入事件,并且有时比终端本身更好地兼容。
  • @noisesmith 在clojure-modeclojure-modeM-x describe-key 以外的模式下一切正常,只是描述了转义序列中第一个有意义的字符(通常是 [),所以问题是特定的到clojure-mode

标签: macos emacs clojure


【解决方案1】:

这里的设置几乎相同,但没有类似问题。这就是我无论如何都会做的。首先,评估暂存缓冲区中的以下 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-mode 时尝试使用 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])))

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    检查您在 Iterm 中的设置,更具体地说是“全局快捷键”。这些将优先于发送到 emacs 的内容。我相信 C-Shift-Arrow 用于在 Iterm 中切换选项卡,并且可能会干扰 emacs。

    【讨论】:

    • @sw1nn 说这只是 clojure 模式下的问题。它在其他模式下工作正常。
    猜你喜欢
    • 2014-12-15
    • 2012-06-07
    • 2011-03-31
    • 2016-12-08
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    相关资源
    最近更新 更多