Emacs Emacs 23和Emacs 24之间的键绑定更改

时间:2012-09-11 02:42:28

标签: emacs key-bindings emacs23 emacs24

我最近升级到Emacs24,并且由于它而导致我的一些自定义键绑定中断。

根据the fine manual,,可以使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做了另一件事,但问题是返回键在终端模式或迷你缓冲区中不再正常运行。在这两种情况下,返回键只是将光标向下移动到下一行而不是激活我刚刚键入的命令,而是向左移动而无法激活我输入到迷你缓冲区的命令或者终端。

具有讽刺意味的是,Emacs24对删除行为进行了大量更改,并在此过程中将C-dDEL分离,以便现在绑定{{1}实际上是安全的不需要将C-d绑定到预期的行为就可以了,所以如果我能够实现类似的话会很棒#34;它只是工作"我的返回键的行为,而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)

但我并不知道任何这样的变量或功能可以帮助我解决这个问题。

我在使用模式挂钩在终端和迷你缓冲模式下恢复正确的绑定方面做了几次尝试失败,但我似乎无法正常工作。救命啊!

感谢。

2 个答案:

答案 0 :(得分: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)))

这里的想法是,不是全局修改返回键(这是破坏终端和迷你缓冲区缓冲区),我们只在每个缓冲区的基础上设置这些键绑定,除了我们无条件地对所有缓冲区执行表示磁盘上的文件。

这有点低效,每次打开文件时都要运行,但是因为我不必考虑每种可能的“修复”模式,所以它很好,它根本不会破坏终端/迷你缓冲/首先是等模式。

答案 1 :(得分:3)

这些&#34;姐妹钥匙的方式&#34;在Emacs中默认处理的是将特殊键(如tabreturn)重定向(通过function-key-map)到它们的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])

这不会影响returntab的处理,因为在input-decode-map之前应用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