从Lisp模式派生,忽略其钩子



因此,我通过从标准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-modeemacs-lisp-mode的实现中得到启示。它们不是一个从另一个派生出来的,而是不同的模式(每个都从prog-mode派生出来)。然而,它们的(独立的)键映射有一个共享的父键映射,这意味着许多键绑定都做同样的事情。

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

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

我很欢迎一个添加lispish-mode的补丁(如果它有更好的名称,那就更好了),但到目前为止,每次我看它时,我都发现Lispish模式之间的差异太大,无法共享太多。

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

  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."
      ...)
    

相关内容

  • 没有找到相关文章

最新更新