8

我最近升级到 Emacs24,我的一些自定义键绑定因此而损坏。

根据精美的手册,可以使 Emacs 停止将功能键与其 ASCII 控制代码混为一谈(例如,可以拥有C-mRET绑定到不同的东西,或C-iTAB,等等)。这一直是我对 Emacs 的一大不满,这些宝贵的“第一级”键盘快捷键被浪费在我已经在我的键盘上有专用键的东西上。在我的情况下,我想将它们绑定到不同的东西,以通过模仿 gedit 来“现代化”键绑定。在 Emacs23 中,它运行良好:

(global-set-key (kbd "C-i") 'goto-line)
(global-set-key (kbd "C-m") 'comment-or-uncomment-region)
(global-set-key (kbd "C-d") 'kill-whole-line)

;; Fix some stuff broken by the above
(global-set-key [delete] 'delete-char)
(global-set-key (kbd "TAB") 'indent-for-tab-command)
(global-set-key (kbd "RET") 'newline)

然后,我升级到 Emacs24,它坏了,有点。从某种意义上说,它仍然“有效”,C-m肯定会做一件事,RET做另一件事,但问题是返回键在终端模式或 minibuffer 中不再正常运行。在这两种情况下,返回键都没有激活我刚刚输入的命令,而是简单地将光标向下移动到下一行,我无法激活我输入到 minibuffer 或终端的命令。

具有讽刺意味的是,Emacs24 对删除行为引入了很多更改,并且在此过程中它们解耦C-dDEL因此现在实际上可以安全地绑定C-d到某些东西而无需绑定DEL回预期的行为,所以如果我能实现那就太好了对于我的返回键,类似的“它只是有效”的行为,而C-m绑定到其他东西。

所以,我可以设想两种可能的解决方案来解决这个问题。一个可能看起来像这样:

(global-set-key (kbd "C-m") 'comment-or-uncomment-region)
(global-set-key (kbd "RET") 'do-what-i-expect-the-return-key-to-do-in-any-mode)

或者,这样的事情会更好:

(setq decouple-ascii-control-codes-from-function-keys t)

但我不知道有任何此类变量或函数可以在这种情况下帮助我。

我曾多次尝试使用模式挂钩来恢复终端和迷你缓冲区模式下的正确绑定,但我似乎无法得到任何工作。帮助!

谢谢。

4

2 回答 2

5

这似乎有效:

(add-hook 'find-file-hook
          (lambda ()
            (local-set-key (kbd "C-m") 'comment-or-uncomment-region)
            (local-set-key (kbd "<return>") 'newline-and-indent)))

这里的想法是,我们不是在全局范围内修改返回键(这会破坏终端和 minibuffer 缓冲区),而是仅在每个缓冲区的基础上设置这些键绑定,除了我们无条件地对代表文件的所有缓冲区执行此操作磁盘。

它的效率有点低,每次打开文件时都必须运行,但它很好,因为我不必考虑“修复”所有可能的模式,它根本不会破坏终端/迷你缓冲区/等模式第一名。

于 2012-09-11T19:26:10.730 回答
3

在 Emacs 中默认处理这些“姐妹键”的方式是(通过功能键映射)将特殊键(如tabreturn)重定向到它们的 ASCII 等效键,然后只将键绑定添加到 ASCII 版本。因此,您可以轻松地为非 ASCII 版本添加新含义,例如

(global-set-key [return] 'my-new-command)

但在你的情况下,你想做相反的事情,即return在改变时让行为像以前一样C-m。我能想到的最可靠的方法(在它应该与大多数主要/次要模式绑定一起使用的意义上是可靠的)是C-m尽早且无条件地重新映射到一些新事件,如:

(define-key input-decode-map [?\C-m] [C-m])
(define-key input-decode-map [?\C-i] [C-i])

这不会影响returnand tabsince input-decode-mapis applied before的处理function-key-map,即在这些键转换为 ASCII 控制键之前。所以你可以这样做:

(global-set-key [C-m] 'my-new-command)
(global-set-key [C-i] 'my-newer-command)

不利的一面是,这不仅适用于绑定,C-i而且还适用于C-c C-i现在只能用作的绑定C-c TAB(有时会很好,但偶尔可能不太容易记忆)。

另一个缺点是,如果有 的绑定tab,则tab无法使用C-i绑定。但是我们可以通过添加以下内容来解决这两个问题:

(define-key function-key-map [C-i] [?\C-i])
(define-key function-key-map [C-m] [?\C-m])

如果没有使用新事件的绑定,这将使新C-i事件恢复正常。C-i

于 2012-09-12T17:42:25.017 回答