Emacs:取消绑定 some-mode-map 的所有键

Emacs: unbind all keys of some-mode-map

我知道,我可以使用 unbind-key 取消绑定密钥。在这种情况下,我必须知道要解除绑定的密钥。但我不知道关键。我只想解绑some-mode-map的所有键。我不想覆盖它们,我只想解除它们的绑定,然后在 some-mode-map 中定义我自己的键。我知道我可以迭代 some-mode-map 并应用 unbind-key,但是否有更直接的解决方案?而且我不知道如何迭代 keymap.

更新

尝试过(正如 在评论中所建议的那样)但没有成功:

(use-package neotree
  :config
  (setq neotree-mode-map (make-sparse-keymap))
  (define-key neotree-mode-map (kbd "RET") 'neotree-enter)
)
(use-package evil
  :init
  (setq evil-overriding-maps '((neotree-mode-map)))
)

neotree-mode-map 仍未清理。根据包配置顺序,evil 绑定会被覆盖。除非我重新定义 neotree-mode-map,否则不会。我知道我可以用 evil-define-key 获得想要的结果,但我想在它自己的配置文件中保留特定于包的设置。如果我使用 evil-define-keyneotree 键绑定定义将在 setup-evil.el 而不是 setup-neotree.el

更新 2

(setq neotree-mode-map (make-sparse-keymap)) 一样有效。 但是 neotree-mode-map 似乎有父映射,这就是 "cleaning" 之后一些键绑定 "come back" 的原因。 我发现的另一件事是,evil 将一些额外信息放入覆盖地图中。

(keymap 
... 
(override-state . all) 
...
)

这就是为什么我应该在evil配置之前清除地图。

您可以使用以下方法在键盘映射中删除所有绑定:

(setf (cdr <keymap>) nil)

我认为在实践中它很少真正做你想要的,因为会有一些你没有意识到的绑定是有用的(例如那些对应于菜单栏条目的绑定),但你得到你想要的。

至于迭代键盘映射,您可以使用 map-keymap