在两个Emacs次要模式下冲突的键盘快捷键

问题描述:

我有一个全局打开的ErgoEmacs次要模式,它定义了许多用于基本编辑的自定义键盘快捷键。但是,当我打开任何lisp文件时,粘液模式将自动打开并覆盖M-pM-n及其自己的命令。但是我想要M-pM-n始终由ergoemacs-mode定义。如何设置次要模式加载和定义键绑定的顺序?或者我该如何提高ergoemacs-mode keybindings的优先级?在两个Emacs次要模式下冲突的键盘快捷键

也许一个简单的解决方法是删除煤泥的绑定:

(add-hook 'slime-mode-hook 
    (lambda() 
    (define-key slime-mode-map [?\M-p] nil) 
    (define-key slime-mode-map [?\M-n] nil))) 

当心:guarantedd 100%未经测试,该变量的名称可能是从泥模地图不同的(很可能将只存在加载粘液模式后)。

如何设置次要模式加载和定义键绑定的顺序?或者我该如何提高ergoemacs-mode keybindings的优先级?

我想你需要确保ErgoEmacs在变量minor-mode-map-alist的slime模式之前出现。有可能有更好的方法,但下面的代码应该实现这一点。让我知道它是否做到了你想要的。

 
(require 'cl) 

(add-hook 
'slime-mode-hook 
(lambda() 
    (let ((elem (first 
     (remove-if-not 
      (lambda (item) (equal 'ergoemacs-mode (car item))) 
      minor-mode-map-alist)))) 
     (setq minor-mode-map-alist (remove elem minor-mode-map-alist)) 
     (add-to-list 'minor-mode-map-alist elem)))) 

+0

它的工作,谢谢!解决方案还是有点怪异。如何确定小模式的加载顺序?也许对这种机制的理解可能会产生更优雅的解决方案。 – 2012-03-10 18:52:21

+0

大多数库都是通过'autoload'机制按需加载的,或者通过'require'显式加载,并且通常应该将加载顺序视为完全任意的,尽管您可以控制它通过显式加载你的init文件,只需重新排序该文件的内容即可。您可能会发现以下有用的:http://*.com/questions/683425/globally-override-key-binding-in-emacs/5340797#5340797 – phils 2012-03-11 10:30:10

+0

let绑定相当于更简洁/清晰'(assoc' ergomacs-mode minor-mode-map-alist)',尽管在这种情况下你可以使用'assq'而不是'assoc' – Felipe 2016-10-31 10:21:16