[英]Emacs keybinding changes between Emacs 23 and Emacs 24
我最近升级到了Emacs24,由于它,我的一些自定义键绑定被破坏了。
根据精细的手册,可以使Emacs停止将功能键与其ASCII控制代码混淆(例如,可以将Cm
和RET
绑定到不同的东西,或Ci
和TAB
,等等)。 这一直是我用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,它破了,有点。 它仍然“工作”,因为Cm
肯定会做一件事,而RET
会做另一件事,但问题是返回键在终端模式或迷你缓冲器中不再正常运行。 在两种情况下,返回键只是将光标向下移动到下一行,而不是激活我输入的命令而不是激活我输入迷你缓冲区或终端的命令。
具有讽刺意味的是,Emacs24对删除行为进行了很多更改,并且在此过程中它们将Cd
与DEL
分离,因此实际上现在可以安全地将Cd
绑定到某些东西而无需将DEL
绑定回预期的行为,因此它会很棒如果我可以为我的返回键实现类似的“它只是工作”行为,而Cm
则绑定到别的东西。
所以,我可以设想两个可能的解决方案来解决这个问题。 一个可能看起来像这样:
(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)
但我不知道任何这样的变量或函数可以帮助我在这种情况下。
我已经做了几次尝试使用模式挂钩在终端和迷你缓冲模式下恢复正确绑定的尝试失败,但我似乎无法得到任何工作。 救命!
谢谢。
这似乎有效:
(add-hook 'find-file-hook
(lambda ()
(local-set-key (kbd "C-m") 'comment-or-uncomment-region)
(local-set-key (kbd "<return>") 'newline-and-indent)))
这里的想法是,不是全局修改返回键(这是破坏终端和迷你缓冲区缓冲区),我们只在每个缓冲区的基础上设置这些键绑定,除了我们无条件地为表示文件的所有缓冲区。磁盘。
它有点低效,每次打开文件时都要运行,但是因为我不必考虑每种可能的“修复”模式,所以它很好,它根本不会破坏终端/迷你缓冲/等模式第一名。
默认情况下,在Emacs中处理这些“姐妹键”的方法是将特殊键(如tab
和return
)重定向(通过function-key-map)到它们的ASCII等价物,然后只将键绑定添加到ASCII版本。 因此,您可以轻松地为非ASCII版本添加新的含义
(global-set-key [return] 'my-new-command)
但在你的情况下,你想要做的相反是让return
以前一样的行为,同时改变Cm
。 我能想到的最可靠的方法(在大多数主要/次要模式绑定应该可行的意义上可靠)是将Cm
早期和无条件地重新映射到某个新事件,如:
(define-key input-decode-map [?\C-m] [C-m])
(define-key input-decode-map [?\C-i] [C-i])
这不会影响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)
一个缺点是,这不仅适用于Ci
绑定,也适用于Cc Ci
绑定, Cc Ci
现在只能用作Cc TAB
(有时候会很好,但偶尔可能会少于助记符)。
另一个缺点是,如果tab
有绑定,则tab
不可用于达到Ci
绑定。 但我们可以通过添加以下内容来解决这两个问题:
(define-key function-key-map [C-i] [?\C-i])
(define-key function-key-map [C-m] [?\C-m])
如果没有使用新事件的绑定,它会将新的Ci
事件重新转换为普通Ci
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.