所以我通过派生标准的Lisp模式为自定义lisp创建了一个主要模式。但是,当emacs输入时,它会自动激活粘液模式,这会覆盖我的大部分绑定。据我所知,这是因为SLIME使用Lisp Mode注册了一些钩子,我的模式也触发了它们,但我不确定。有办法避免这种情况吗?
如果你正在使用define-derived-mode
,那么你的父模式的body和mode hook将会运行。
有关详细信息,请参阅https://stackoverflow.com/a/19295380。
如果你在slime-mode
中启用lisp-mode-hook
,并且你的新模式来自lisp-mode
,那么最简单的方法是在你的派生模式的模式钩子中再次禁用slime-mode
。
编辑:实际上我相信你可以通过在模式体内操纵delayed-mode-hooks
来防止祖先模式的模式挂钩运行。
(您无法阻止祖先模式的主体运行。)
不过,我建议你不要这样做。我想如果你发现自己想要搞乱派生模式机制(特别是如果你打算共享代码),那么你根本就不应该使用派生模式。
你可能应该从lisp-mode
和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."
...)