当两个 emacs 包中的键绑定重叠时,首选一个函数



在OS X上,.emacs只包含以下行:

(require 'dired)
(add-hook 'dired-load-hook
      (function (lambda ()
              (load "dired-x"))))

dired-omit-modedired-xns-open-file-using-panel ns-win争夺钥匙绑定M-o。

我理解上面的 .emacs 指定 dired-x 应该在 dired 之后加载——因此 dired-x 中 M-o 的绑定应该在 emacs 启动时接管。事实并非如此。出于某种原因,ns-win 中的绑定获胜。

如何在启动时强制 dired-x 键绑定?

编辑

(根据菲尔斯的建议(如果我的 .emacs 还加载了定义 M-o 的另外两个包

(require 'ns-win)
(require 'facemenu)
(require 'dired)
(add-hook 'dired-load-hook
      (function (lambda ()
              (load "dired-x"))))

即使 dired 是最后加载的,FaceMenu 中的绑定仍然会接管。

首先,加载ns-win,以便它设置其绑定。然后这个:

(add-hook 
 'dired-mode-hook
 (lambda()
   (require 'dired-x)
   (define-key dired-mode-map (kbd "M-o") 'dired-omit-mode)))

dired-mode-hook将覆盖之前的任何内容绑定到M-o dired-mode.

编辑:啊,对不起,我的答案无关紧要。

首先,dired-x 将其绑定添加到主模式映射(dired-mode-map(,所有次要模式映射优先于主要模式映射。

其次,我假设您的ns-win使用的是次要模式也可能是无效的。我真的应该首先告诉你链接到它(你应该总是链接到非标准库(。

谷歌建议它使用全局键盘映射,在这种情况下,它不应该覆盖可怕的地图,但它也使用超级而不是meta作为其修饰键,所以我完全不确定我是否在查看你正在使用的版本。

如果您的ns-win确实提供了次要模式,那么最简单的选择可能是使用自定义函数破坏次要模式的绑定,该函数检查主要模式,然后根据需要调用原始函数或 dired-x 函数。

您可以使用 Emacs 键绑定回退方法来最小化假设的数量。您的测试将是(eq major-mode 'dired-mode) .


原始答案;实际上与问题无关:

次要模式映射优先级由minor-mode-map-alist中条目的顺序控制,这取决于库的加载顺序。最近加载的模式具有最高优先级(新条目添加到列表前面(。

有关操作此 alist 以提供特定模式优先级的一个示例,请参阅 https://stackoverflow.com/a/5340797/324105(在您的情况下,您可能希望使用 eval-after-load 来执行测试,因为它是一次性的(。

或者,您可以按所需的顺序强制加载/要求两个库。Emacs 需要更长的时间来启动,但你不必担心惹恼 alist。

我只是建议使用您喜欢的任何方法。

最新更新