Emacs:解除绑定 some-mode-map 的所有键

nic*_*lai 4 emacs key-bindings

我知道,我可以使用unbind-key. 在这种情况下,我必须知道要解除绑定的密钥。但我不知道关键。我只想解开some-mode-map. 我不想覆盖它们,我只想解除它们的绑定,然后在some-mode-map. 我知道我可以迭代some-mode-map和应用unbind-key,但可能有更直接的解决方案吗?而且我不知道如何迭代一个keymap.

更新

以这种方式尝试过(正如phils在评论中所建议的那样),但没有奏效:

(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)))
)
Run Code Online (Sandbox Code Playgroud)

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有父映射,这就是为什么一些键绑定在“清理”后“回来”的原因。我发现的另一件事是,evil将一些额外信息放入覆盖地图中。

(keymap 
... 
(override-state . all) 
...
)
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*fan 5

您可以使用以下命令清除键映射中的所有绑定:

(setf (cdr <keymap>) nil)
Run Code Online (Sandbox Code Playgroud)

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

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

  • `(setcdr &lt;keymap&gt; nil)` 是较短的版本。 (2认同)