因此,我通过从标准lisp模式派生,为自定义lisp创建了一个主模式。然而,当emacs进入它时,它也会自动激活slim模式,这会覆盖我的大多数绑定。据我所知,之所以会发生这种情况,是因为SLIME在Lisp模式中注册了一些钩子,而我的模式也会触发它们,但我不确定。有办法避免这种情况吗?
如果使用define-derived-mode
,则将运行父模式的主体和模式挂钩。
请参阅https://stackoverflow.com/a/19295380详细信息。
如果您在lisp-mode-hook
中启用slime-mode
,并且您的新模式是从lisp-mode
派生的,那么最简单的就是在派生模式的模式挂钩中再次禁用slime-mode
。
编辑:事实上,我相信你可以通过在模式的主体中操作delayed-mode-hooks
来阻止祖先模式的模式挂钩运行。
(你无法阻止祖先模式的主体运行。)
不过,我建议您不要这样做。我认为,如果你发现自己想破坏派生模式机制(尤其是如果你计划共享代码),那么你根本不应该使用派生模式。
您可能应该从lisp-mode
与emacs-lisp-mode
的实现中得到启示。它们不是一个从另一个派生出来的,而是不同的模式(每个都从prog-mode
派生出来)。然而,它们的(独立的)键映射有一个共享的父键映射,这意味着许多键绑定都做同样的事情。
我建议使用该代码作为创建一个新的lisp ish主模式的模板。
正确的方法是从lisp模式的父级继承。理想情况下,所有类似Lisp的主模式都应该使用一个父lispish-mode
,但目前还没有,所以您必须使用prog-mode
,然后从lisp-mode
手动设置/复制您想要的东西。
我很欢迎一个添加lispish-mode
的补丁(如果它有更好的名称,那就更好了),但到目前为止,每次我看它时,我都发现Lispish模式之间的差异太大,无法共享太多。
我可以看到两种方法来解决问题
-
更改添加到
lisp-mode-hook
的钩子函数,使其测试(eq major-mode 'lisp-mode)
,因此不会在派生模式中执行。 -
在运行父级时禁用
lisp-mode-hook
:(defun my-tamed-lisp-mode () (let ((lisp-mode-hook nil)) (lisp-mode))) (define-derived-mode my-custom-lisp-mode my-tamed-lisp-mode "CustomLisp" "Major mode for my custom Lisp." ...)