我最近升级到了Emacs24,结果我的一些自定义键绑定就出问题了。
根据详细说明,可以让Emacs停止将功能键与它们的ASCII控制码混淆(例如,可以将C-m
和RET
绑定到不同的东西,或者将C-i
和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,但它出了点问题。它仍然在某种程度上“工作”,比如
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)
或者,像这样更好:
(setq decouple-ascii-control-codes-from-function-keys t)
但是我不知道是否有任何变量或函数可以在这种情况下帮助我。
我尝试使用模式钩子来恢复终端和迷你缓冲区模式中的正确绑定,但是我似乎无法让任何东西正常工作。求助!
谢谢。
find-file
通常所做的工作量(例如使用M-x find-function RET find-file-noselect RET
命令),你会发现你对local-set-key
的两次调用显然是微不足道的。 - user4815162342