两个Emacs次要模式中的键盘快捷键冲突问题

3

我全局开启了一个 ErgoEmacs 的小模式,它为基本编辑定义了许多自定义键盘快捷方式。但是当我打开任何 Lisp 文件时,slime-mode 会自动开启并覆盖 M-pM-n 快捷键。然而,我希望 M-pM-n 始终由 ergoemacs-mode 定义。如何设置小模式加载的顺序和定义键绑定的顺序?或者如何提高 ergoemacs-mode 键绑定的优先级?

2个回答

3
如何设置次要模式的加载顺序并定义键绑定?或如何提高ErgoEmacs模式的键绑定优先级?
我认为您需要确保在变量minor-mode-map-alist中ErgoEmacs出现在slime-mode之前。也许有更好的方法,但是下面的代码应该可以实现这一点。如果它能满足您的要求,请告诉我。
``` (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)))) ```

可以了,谢谢!解决方案仍然有点hacky。如何确定次要模式的加载顺序?也许理解这个机制可以产生更优雅的解决方案。 - Mirzhan Irkegulov
大多数库都是通过autoload机制按需加载的,或者通过require显式加载的,你通常应该将加载顺序视为完全任意的,尽管你可能能够通过重新排列文件内容来控制显式加载的内容。你可能会发现以下链接有用:https://dev59.com/nHRB5IYBdhLWcg3wN1EQ#5340797 - phils
let绑定相当于更简洁/清晰的(assoc 'ergomacs-mode minor-mode-map-alist),但在这种情况下,您可以使用assq而不是assoc - Felipe

2
也许更简单的解决方案是删除Slime的绑定:
(add-hook 'slime-mode-hook
  (lambda ()
    (define-key slime-mode-map [?\M-p] nil)
    (define-key slime-mode-map [?\M-n] nil)))

注意:这个变量名可能与slime-mode-map不同(并且只有在加载slime-mode后才会存在),但是保证100%未经测试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接