在Emacs中,有没有一种快速取消按键绑定的方法?

29

我使用了 ctrl h b 快捷键在 Emacs 中查看所有绑定的按键。现在我想要解除大量按键的绑定,因为我从不使用这些 Emacs 的功能,并且我不希望在意外按到这些按键时执行它们!这也释放了很多按键供其他任务使用(例如与 Cedet 一起使用)。除了 global-unset-key,还有没有其他方法可以批量删除绑定?

C-a     移动光标到行首
C-b     向后移动一个字符
C-c     模式特定命令前缀
C-d     删除一个字符
C-e     移动光标到行尾
C-f     向前移动一个字符
C-g     取消当前操作
C-h     帮助命令
C-k     删除光标到行尾的内容
C-l     重新显示屏幕
C-n     下移光标
C-o     打开新行
C-p     上移光标
C-q     插入特殊字符
C-t     交换两个字符
C-u     统一数值参数
C-v     向下滚屏
C-x     控制-X前缀
C-z     挂起框架
ESC     ESC前缀

我想要删除掉其中大部分对我来说没有用的绑定。


如果你想使用“标准”的按键绑定,例如将C-v用于yankC-x用于kill-region等等,请查看cua-mode。它可以在保留Emacs功能的同时实现这一点。 - haxney
2
请注意这些绑定非常多,特别是在emacs中Named-ASCII-Chars。禁用ESC("\e")将禁用基于meta键的几乎所有功能(至少在这里)。此外,C-cC-x是一流的前缀,可分支到许多命令。 - Nikana Reklawyks
2个回答

38

没有内置的方法可以取消很多键,因为你可以自己轻松地做到:

(为严格正确性而编辑:)

(dolist (key '("\C-a" "\C-b" "\C-c" "\C-d" "\C-e" "\C-f" "\C-g"
               "\C-h" "\C-k" "\C-l" "\C-n" "\C-o" "\C-p" "\C-q"
               "\C-t" "\C-u" "\C-v" "\C-x" "\C-z" "\e"))
  (global-unset-key key))
虽然我必须说,大多数你称之为“无用”的命令我会称之为“必要的”。
(编辑补充:)
至于释放出其他任务的键,有很多未使用过的键:
- 按下 C-c 后加上一个字母的键序列按照惯例是为用户保留的。 - 如果你有额外的修饰键可用,比如 Mac 上的 Option 键或 PC 上的 Windows 键,可以将其与 Emacs 的修饰键(如 super)相关联。例如,我将 super-b 绑定到了 browse-url-at-point。 - 如果你不在纯文本终端上,Shift 键就会变得可用以区分键序列。例如,我将 shift-meta-b 绑定到了 bury-buffer。 - 对于那些虽然有用但运行次数不够多,不足以获得专用键序列的命令,可以使用 defalias 来提供更短的名称。在我的 .emacs 文件中,我有 (defalias 'ru 'rename-uniquely)(defalias 'c 'calendar)(还有其他很多)。

1
这对于除了C-z键以外的所有键都有效,但是C-z键却在某种程度上最小化了emacs,尽管它应该是“挂起缓冲区”。我是否漏掉了什么? - AnkurVj
7
与其取消绑定,我建议你逐渐熟悉特别是 C-a 和 C-e 这两个快捷键。这样做会让你的双手不再频繁离开主键位置,最终可以省下很多时间。 - drysdam
2
这就是为什么我正在逐渐将所有其他编辑器合并到emacs中。甚至我的浏览器现在也是“conkeror”,它基本上是在浏览器中重新实现(极小部分的) emacs。 - drysdam
@event_jr:谢谢你的提示。我很少使用kbd,只是在这里尝试简化,并且不想在我的长时间运行的Emacs会话中测试代码。 - Sean
很高兴这个答案实际上对提问者有所帮助,而在此之前没有提到任何形式的“你应该学习这些关键点”(我同意这一点,但与所问问题无关)。有很多原因给予+1评价:·) - Nikana Reklawyks
显示剩余4条评论

13

global-unset-keylocal-unset-key很有用,但是值得注意的是,对于任何键映射来说,解除绑定键(unbind a key)的一般方法是定义一个nil的绑定:

(define-key KEYMAP KEY nil)

如果你跟随那两个函数的代码,你会注意到这正是它们所做的。


2
在emacs 24中,将默认键设置为nil没有任何效果,并保留默认值。 - alinsoar
1
“默认键”是什么意思? - phils
1
该绑定位于全局键映射中,因此以下任一方法都可以正常工作:(define-key global-map (kbd "M-)") nil)(global-unset-key (kbd "M-)"))。如果这种方法似乎不起作用,则可能是您正在使用错误的键映射(或绑定出现在多个键映射中,您需要对多个键映射执行此操作)。 - phils
1
我认为你对键位映射和绑定的工作方式有些困惑。如果在python-mode的键位映射中没有定义M-),那么你就不能从键位映射中解除绑定,因为没有东西可以解除绑定。另一方面,你可以为该键位映射绑定它,以优先于全局绑定。我建议你阅读米奇出色的Emacs键位绑定文章:http://www.masteringemacs.org/articles/2011/02/08/mastering-key-bindings-emacs/ - phils
1
我知道键位映射和emacs。我编写了主要模式(例如,可以在Google上搜索由我编写的Backus-Naur主要模式)。我的当前解决方案是在python-mode-map中本地绑定一个虚拟的lambda-interactive函数,如下所示:(define-key python-mode-map(kbd“M-)”)(lambda()(interactive)),以覆盖错误的函数。我需要更智能的解决方案。我需要仅在python-mode中删除该绑定。是的,我没有太多考虑这个问题,但在匆忙中我试图清除它,因为它干扰了我 - 我每天使用这些天python mode超过10小时。 - alinsoar
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接