在两个Emacs次要模式下冲突的键盘快捷键
问题描述:
我有一个全局打开的ErgoEmacs次要模式,它定义了许多用于基本编辑的自定义键盘快捷键。但是,当我打开任何lisp文件时,粘液模式将自动打开并覆盖M-p和M-n及其自己的命令。但是我想要M-p和M-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))))
它的工作,谢谢!解决方案还是有点怪异。如何确定小模式的加载顺序?也许对这种机制的理解可能会产生更优雅的解决方案。 – 2012-03-10 18:52:21
大多数库都是通过'autoload'机制按需加载的,或者通过'require'显式加载,并且通常应该将加载顺序视为完全任意的,尽管您可以控制它通过显式加载你的init文件,只需重新排序该文件的内容即可。您可能会发现以下有用的:http://*.com/questions/683425/globally-override-key-binding-in-emacs/5340797#5340797 – phils 2012-03-11 10:30:10
let绑定相当于更简洁/清晰'(assoc' ergomacs-mode minor-mode-map-alist)',尽管在这种情况下你可以使用'assq'而不是'assoc' – Felipe 2016-10-31 10:21:16