在OS X上,.emacs仅包含以下行:
(require 'dired)
(add-hook 'dired-load-hook
(function (lambda ()
(load "dired-x"))))
dired-omit-mode
中的{p> dired-x
和ns-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中的绑定仍然会接管。
答案 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
使用次要模式也可能无效。我真的应该告诉你首先链接到那个(你应该总是链接到非标准库)。
如果您的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。
我建议您使用您认为合适的方法。