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

时间:2013-08-07 15:51:51

标签: macos emacs dired

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

(require 'dired)

(add-hook 'dired-load-hook
      (function (lambda ()
              (load "dired-x"))))
dired-omit-mode中的{p> dired-xns-open-file-using-panel中的ns-win争夺关键字绑定的M-o。

我理解上面的.emacs指定dired-x应该在dired之后加载 - 因此当emacs启动时,dired-x中M-o的绑定应该接管。不是这种情况。出于某种原因,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中的绑定仍然会接管。

2 个答案:

答案 0 :(得分:0)

首先,加载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

答案 1 :(得分:0)

编辑:啊,抱歉,我的回答无关紧要。

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

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

Google建议使用全局键映射,在这种情况下它应该永远不会覆盖dired映射,而且它使用super而不是meta作为其修饰键,所以我完全不确定我在看你正在使用的版本。

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

您可以使用Emacs key binding fallback方法来最小化假设数量。您的测试将是(eq major-mode 'dired-mode)


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

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

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

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

我建议您使用您认为合适的方法。