在Emacs中取消按键绑定

33
例如,在zen-coding的代码中,"C-j"覆盖了"newline-and-indent"的正常行为。
(define-key zencoding-mode-keymap (kbd "C-j") 'zencoding-expand-line)

那么我该如何取消这个按键绑定并再次使用C-j来进行newline-and-indent呢?

我尝试过这个方法,但它不起作用:

(add-hook 'html-mode-hook
          (lambda ()
            (progn
              (zencoding-mode)
              (local-set-key (kbd "C-j") 'newline-and-indent))))

有人对此有什么想法吗?


有人知道为什么在这种情况下 add-hook 不起作用吗? - darksky
1
Nayefc:该代码不会影响zencoding-mode的按键映射,因为zencoding-mode是一个次要模式,并且(根据下面的答案)local-set-key会影响主模式的按键映射。次要模式的按键映射优先于主模式的按键映射,因此未修改的zencoding-mode绑定继续被使用。 - phils
1个回答

54

通用的解除按键绑定的方法(适用于任何按键映射)是定义一个nil的绑定:

(define-key KEYMAP KEY nil)

为方便起见,还有两个标准函数可用于从全局按键映射和本地按键映射(通常是主模式的按键映射)中解除绑定。

  • (global-unset-key KEY)
  • (local-unset-key KEY)

这些函数都是交互式命令,与它们各自的补充函数 global-set-keylocal-set-key 相对应。

至于您的具体示例,您可能需要像这样:

(with-eval-after-load "zencoding-mode"
  (define-key zencoding-mode-keymap (kbd "C-j") nil))

为了帮助其他试图执行类似操作的读者,这些参数是"zencoding-mode",因为被加载的库的名称为zencoding-mode.el(请注意,您应该省略“ .el”后缀);而zencoding-mode-keymap则不同于典型/预期的zencoding-mode-map,因为zencoding-mode.el在显式声明其键位图并且不使用标准名称。

使用C-hk检查涉及的键绑定到什么上面,Emacs将告诉您键位图和库的名称,从而确定这两个参数。


1
我会说这是完美的答案。 - PascalVKooten
2
也许这应该是一个完整的问题,但如果我不知道它的名称,有什么好的方法来确定键映射的名称? - Samuel Edwin Ward
2
@SamuelEdwinWard 使用 C-h k,然后输入键绑定。 - Vivi
1
Samuel Edwin Ward:请查看http://emacs.stackexchange.com/questions/653/how-can-i-find-out-in-which-keymap-a-key-is-bound - phils
1
@Hi-Angel,Emacs 可能正在显示 M-DEL (translated from <M-backspace>),对吧?diff-mode-map 绑定的是 M-DEL 而不是 <M-backspace>(而后者在 diff-mode-map 被查看之前就已经被翻译了)。 - phils
显示剩余4条评论

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