如何在elisp中覆盖/更改模式键绑定?

5

特别是当我加载dired-x时,它将M-o设置为切换omit minor模式。我将M-o用于other-window,因此我想更改dired-x绑定的键为其他内容。我尝试在模式加载后像这样设置键:

(add-hook 'dired-mode-hook
  (lambda ()
    (dired-omit-mode 1)
    (global-set-key (kbd "M-o") 'other-window)
    ))

但是一无所获。

1
试着看看 https://dev59.com/2FDTa4cB1Zd3GeqPK6i0#3773856 ? - Francois G
没有找到那个,谢谢。这与下面被接受的答案相同。 - Loren
1
我喜欢 Stack Overflow:不仅是我想要的,而且还是我想要的关键绑定... - Shep
2个回答

7
稍微比在本地模式映射中添加自定义全局绑定的另一个副本更好的方法是删除本地绑定,以便它不再遮盖全局绑定。在执行此操作之前,您可能还需要为该函数指定一个新键。
(eval-after-load "dired-x"
  '(progn
     ;; Add an alternative local binding for the command
     ;; bound to M-o
     (define-key dired-mode-map (kbd "C-c o")
       (lookup-key dired-mode-map (kbd "M-o")))
     ;; Unbind M-o from the local keymap
     (define-key dired-mode-map (kbd "M-o") nil)))

5
绑定覆盖了全局绑定,因此您的无法起作用。您需要覆盖中的绑定:
(add-hook 'dired-mode-hook
  (lambda ()
    (dired-omit-mode 1)
    (define-key dired-mode-map (kbd "M-o") 'other-window)
    ))

谢谢!对于其他有这个问题的人来说,将define-key放在hook内部是不必要的。 - Loren
3
但是在使用它时,dired-mode-map 的存在是必要的。 - phils

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