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

rob*_*bru 8 emacs key-bindings emacs23 emacs24

我最近升级到了Emacs24,由于它,我的一些自定义键绑定被破坏了.

根据该精细的手工,有可能使Emacs的停止混为一谈与他们的ASCII控制码的功能键(例如,它可能有C-m,并RET绑定到不同的东西,或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)
Run Code Online (Sandbox Code Playgroud)

然后,我升级到Emacs24,它破了,有点.它仍然"工作",在某种意义上C-m肯定做一件事,RET做另一件事,但问题是返回键在终端模式或迷你缓冲器中不再正常运行.在两种情况下,返回键只是将光标向下移动到下一行,而不是激活我输入的命令,而不是激活我输入迷你缓冲区或终端的命令.

具有讽刺意味的是,Emacs24对删除行为进行了很多更改,并且在这个过程中它们分离C-d,DEL以便实际上现在可以安全地绑定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)
Run Code Online (Sandbox Code Playgroud)

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

(setq decouple-ascii-control-codes-from-function-keys t)
Run Code Online (Sandbox Code Playgroud)

但我不知道任何这样的变量或函数可以帮助我在这种情况下.

我已经做了几次尝试使用模式挂钩在终端和迷你缓冲模式下恢复正确绑定的尝试失败,但我似乎无法得到任何工作.救命!

谢谢.

rob*_*bru 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)))
Run Code Online (Sandbox Code Playgroud)

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

它有点低效,每次打开文件时都要运行,但是因为我不必考虑每种可能的"修复"模式,所以它很好,它只是不会破坏终端/迷你缓冲/等模式第一名.


Ste*_*fan 3

在 Emacs 中默认处理这些“姐妹键”的方式是将特殊键(例如tab、 和return)重定向(通过 function-key-map)到它们的 ASCII 等效键,然后仅将键绑定添加到 ASCII 版本。因此,您可以轻松地向非 ASCII 版本添加新含义,例如

(global-set-key [return] 'my-new-command)
Run Code Online (Sandbox Code Playgroud)

但就您而言,您想做相反的事情,即return在更改时让行为像以前一样C-m。我能想到的最可靠的方法(可靠是指它应该与大多数主要/次要模式绑定一起工作)是C-m尽早无条件地重新映射到某些新事件,如下所示:

(define-key input-decode-map [?\C-m] [C-m])
(define-key input-decode-map [?\C-i] [C-i])
Run Code Online (Sandbox Code Playgroud)

return这不会影响和的处理,tab因为在input-decode-map之前应用function-key-map,即在这些键转换为 ASCII 控制键之前。所以你可以这样做:

(global-set-key [C-m] 'my-new-command)
(global-set-key [C-i] 'my-newer-command)
Run Code Online (Sandbox Code Playgroud)

缺点是,这不仅适用于绑定,而且还适用于现在只能作为的C-i绑定(有时会很好,但有时可能不太容易助记)。C-c C-iC-c TAB

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

(define-key function-key-map [C-i] [?\C-i])
(define-key function-key-map [C-m] [?\C-m])
Run Code Online (Sandbox Code Playgroud)

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