因此,我通过从标准 Lisp 模式派生,为自定义 lisp 创建了一个主要模式。但是,当 emacs 进入它时,它也会自动激活 slime-mode,它会覆盖我的大部分绑定。据我所知,这是因为 SLIME 使用 Lisp 模式注册了一些钩子,而我的模式也触发了它们,但我不确定。有没有办法避免这种情况?
3 回答
如果您正在使用,define-derived-mode
那么您的父模式的主体和模式挂钩将运行。
有关详细信息,请参阅https://stackoverflow.com/a/19295380。
如果您在 中启用slime-mode
,lisp-mode-hook
并且您的新模式是从 派生的lisp-mode
,那么最简单的方法是在派生模式的模式挂钩中再次禁用。 slime-mode
delayed-mode-hooks
编辑:实际上,我相信您可以通过在模式主体中进行操作来阻止祖先模式的模式挂钩运行。
(您无法阻止祖先模式的主体运行。)
不过,我建议您不要这样做。我认为,如果您发现自己想要弄乱派生模式机制(特别是如果您打算共享代码),那么您根本不应该使用派生模式。
您可能应该从lisp-mode
vs的实现中得到启发emacs-lisp-mode
。它们不是一个派生自另一个,而是不同的模式(每个派生自prog-mode
)。但是,它们的(独立)键映射具有共享的父键映射,这意味着许多键绑定执行相同的操作。
我建议使用该代码作为创建新的 lisp-ish 主要模式的模板。
正确的方法是从 lisp-mode 的父级继承。理想情况下,所有类似 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." ...)