【问题标题】:Is there a quick way to unbind keys in Emacs?有没有一种快速的方法来取消 Emacs 中的键绑定?
【发布时间】:2011-09-25 23:13:00
【问题描述】:

我做了一个 ctrl h b 来查看我在 emacs 中的所有绑定。现在我想解除很多键的绑定,只是因为我从不使用 Emacs 的那些功能,而且我不想在我不小心按下绑定的键时执行它们!这也为其他任务释放了很多密钥(例如与 Cedet 一起使用)。那么除了 global-unset-key 之外,还有什么方法可以批量移除绑定吗?

C-a     move-beginning-of-line
C-b     backward-char
C-c     mode-specific-command-prefix
C-d     delete-char
C-e     move-end-of-line
C-f     forward-char
C-g     keyboard-quit
C-h     help-command
C-k     kill-line
C-l     recenter-top-bottom
C-n     next-line
C-o     open-line
C-p     previous-line
C-q     quoted-insert
C-t     transpose-chars
C-u     universal-argument
C-v     scroll-up
C-x     Control-X-prefix
C-z     suspend-frame
ESC     ESC-prefix

我想删除大部分对我来说毫无用处的绑定。

【问题讨论】:

  • 如果您想使用C-v 的“标准”键绑定yankC-x 用于kill-region 等等,请查看cua-mode,它在保留 Emacs 的同时实现了这一点功能。
  • 请记住,这些确实是很多的绑定,尤其是使用 emacs Named-ASCII-Chars禁用ESC ("\e") 会禁用基于元键的几乎所有内容(至少在这里)。 C-cC-x 也是分支到许多命令的一流前缀。

标签: emacs


【解决方案1】:

没有内置方法可以取消设置很多键,因为很容易自己完成:

(为严格正确而编辑:)

(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)(以及许多其他文件)。

【讨论】:

  • 是的,但我使用home end 和箭头键等来达到相同的效果。我已经习惯了这些,以至于我发现很难适应其他一些导航键。另外,我希望我可以使用这样的钥匙来完成对我来说更重要的任务。例如,我想使用 C-z 撤消,因为我发现使用默认的 C-x C-u 事物很难进行多次撤消。
  • 这适用于除 C-z 之外的所有键,尽管它应该是“暂停缓冲区”,但它以某种方式最小化 emacs。我在这里有什么遗漏吗?
  • 嘿,它工作了一次,下一次它停止工作..你能帮我调试一下吗?我两次都复制粘贴了完全相同的东西,现在我无法让它工作..它一直说“-Lisp错误:(错误类型参数整数或标记-p键)”! :( :(
  • 与其解除绑定,我只是习惯了 C-a 和 C-e。你最终会节省很多时间,而不是把手从主排上移开。
  • 这就是为什么我逐渐将所有其他编辑器合并到 emacs 中。甚至我的浏览器现在都是“conkeror”,它基本上在浏览器中重新实现(一小部分)emacs。
【解决方案2】:

global-unset-keylocal-unset-key 很有用,但值得回答这个问题,指出解除键绑定的通用方法(对于 any keymap) 是定义nil的绑定:

(define-key KEYMAP KEY nil)

如果您遵循这些其他功能中的任何一个的代码,您会注意到它们正是这样做的。

【讨论】:

  • 在 emacs 24 中,将默认键设置为 nil 无效,并保留默认值。
  • “默认键”是什么意思?
  • 该绑定在全局键映射中,因此任一都可以正常工作,如所述:(define-key global-map (kbd "M-)") nil)(global-unset-key (kbd "M-)"))。如果这种方法似乎不起作用,那么您只是使用了错误的键映射(或者绑定出现在多个键映射中,并且您需要为多个键映射)。
  • 我认为您对键盘映射和绑定的工作方式感到困惑。如果 M-) 没有在 python-mode 的键盘映射中定义,那么你不能从 that 键盘映射中解绑它,因为没有什么可以解绑的。 OTOH,您可以为该键映射绑定它,以便优先于全局绑定。我推荐你阅读 Mickey 关于 Emacs 键绑定的优秀文章:masteringemacs.org/articles/2011/02/08/…
  • 伙计,我知道键盘映射和 emacs。我编写了主要模式(例如谷歌为我编写的 Backus-Naur 主要模式)。我目前的解决方案是在 python-mode-map 中本地绑定一个虚拟 lambda 交互函数,所以:(define-key python-mode-map (kbd "M-)") (lambda () (interactive))),为了覆盖坏函数。我需要更智能的解决方案。我只需要在 python 模式下删除该绑定。是的,我对这个问题并没有想太多,但是我匆忙尝试清除它,因为它打扰了我——我这些天使用 python 模式 > 每天 10 小时。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-24
  • 1970-01-01
  • 1970-01-01
  • 2018-09-19
  • 1970-01-01
相关资源
最近更新 更多