Macos 当两个emacs包中的keybinding重叠时,首选一个函数

Macos 当两个emacs包中的keybinding重叠时,首选一个函数,macos,emacs,dired,Macos,Emacs,Dired,在OS X上,使用仅包含以下行的.emacs: (require 'dired) (add-hook 'dired-load-hook (function (lambda () (load "dired-x")))) dired-x中的dired-omit模式,以及ns-win中的ns使用面板打开文件 我理解上面的.emacs指定dired-x应该在dired之后加载,因此dired-x中的M-o绑定应该在emacs启动时接管。事实并非如此。由于某些原

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

(require 'dired)

(add-hook 'dired-load-hook
      (function (lambda ()
              (load "dired-x"))))
dired-x中的
dired-omit模式
,以及
ns-win中的
ns使用面板打开文件

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

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

编辑

(根据phils的建议) 如果my.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模式挂钩
将覆盖以前的任何内容
已绑定到M-o,用于
直接模式

编辑:啊,对不起,我的答案不相关

首先,dired-x将其绑定添加到主模式映射(dired模式映射),并且所有副模式映射优先于主模式映射

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

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

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

您可以使用该方法来最小化假设的数量。您的测试将是
(eq主模式'dired模式)


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

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

请参阅操纵此列表以提供特定模式优先级的示例(在您的情况下,您可能希望使用
eval after load
执行测试,因为这是一次性的)

或者,您可以按所需顺序强制加载/要求两个库。Emacs的启动时间稍长一些,但您不必担心会弄乱列表


我建议您使用您喜欢的方法。

这有必要吗?dired-x.el已经有了(定义键dired模式映射“\M-o”'dired-omit mode)。那么我就不明白你的要求了。M-o应该调用哪个函数?我的词汇选择可能不是很好。我编辑了这个问题以澄清它。启动时花费的时间稍微长一点不是问题(1.我每天做一次2.使用1000+行。emacs,emacs仍然会立即加载)。因此,我尝试了您建议的两个想法(加载包)中的第二个,但没有成功。我修改了这个问题以反映这一点。
dired load hook
在您尝试使用它之前已经启动,因此您的代码永远不会运行。在这种情况下,在
(require'dired)
之后使用
(require'dired-x)
更简单,并且去掉钩子。对于包含(require'ns win)(require'facemenu)(require'dired)(load“dired-x”)的.emacs,M-o仍然调用ns win.D'oh中的函数。更新答案。需要更多信息。