从Lisp Mode派生,忽略它的钩子?

问题描述 投票:2回答:3

所以我通过派生标准的Lisp模式为自定义lisp创建了一个主要模式。但是,当emacs输入时,它会自动激活粘液模式,这会覆盖我的大部分绑定。据我所知,这是因为SLIME使用Lisp Mode注册了一些钩子,我的模式也触发了它们,但我不确定。有办法避免这种情况吗?

emacs slime major-mode
3个回答
3
投票

如果你正在使用define-derived-mode,那么你的父模式的body和mode hook将会运行。

有关详细信息,请参阅https://stackoverflow.com/a/19295380

如果你在slime-mode中启用lisp-mode-hook,并且你的新模式来自lisp-mode,那么最简单的方法是在你的派生模式的模式钩子中再次禁用slime-mode


编辑:实际上我相信你可以通过在模式体内操纵delayed-mode-hooks来防止祖先模式的模式挂钩运行。

(您无法阻止祖先模式的主体运行。)

不过,我建议你不要这样做。我想如果你发现自己想要搞乱派生模式机制(特别是如果你打算共享代码),那么你根本就不应该使用派生模式。

你可能应该从lisp-modeemacs-lisp-mode的实现中得到启示。它们不是从另一个派生出来的,而是不同的模式(每个模式都来自prog-mode)。它们的(独立)键映射具有共享的父键映射,但是,这意味着许多键绑定会执行相同的操作。

我建议使用该代码作为模板来创建一个新的lisp-ish主模式。


1
投票

正确的方法是从lisp-mode的父级继承。理想情况下,所有类似Lisp的主要模式都应该使用父级lispish-mode,但目前还没有这样的东西,所以你必须使用prog-mode,然后从lisp-mode手动设置/复制你想要的东西。

我欢迎一个补丁添加一个lispish-mode(如果它有一个更好的名字,甚至更好),但到目前为止每次我看着它我最终发现Lispish模式之间有太多的变化,因为有很多共享。


0
投票

我可以看到两种方法来解决这个问题

  1. 更改添加到lisp-mode-hook的钩子函数,以便它测试(eq major-mode 'lisp-mode),因此不会在派生模式下执行。
  2. 在运行父级时禁用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." ...)
© www.soinside.com 2019 - 2024. All rights reserved.