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

Derive from Lisp Mode, ignoring its hooks?

因此,我通过派生自标准 Lisp 模式为自定义 Lisp 创建了一个主要模式。然而,当 emacs 进入它时,它也会自动激活 slime-mode,这会覆盖我的大部分绑定。据我所知,发生这种情况是因为 SLIME 向 Lisp 模式注册了一些挂钩,而我的模式也触发了它们,但我不确定。有没有办法避免这种情况?

如果您正在使用 define-derived-mode,那么 body 和 parent 模式的模式挂钩将变为 运行。

详见https://whosebug.com/a/19295380

如果您在 lisp-mode-hook 中启用 slime-mode,并且您的新模式是从 lisp-mode 派生的,那么 最简单的 会在派生模式的模式挂钩中再次 禁用 slime-mode


编辑:实际上我相信您可以通过在 body[=41= 中操纵 delayed-mode-hooks 来阻止祖先模式的模式挂钩 运行ning ] 你的模式。

(你无法阻止祖先模式的身体运行宁。)

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

您可能应该从 lisp-modeemacs-lisp-mode 的实现中得到启发。它们不是一个派生自另一个,而是不同的模式(每个派生自 prog-mode)。他们的(独立)键映射有一个共享的 parent 键映射,但是,这意味着很多键绑定做同样的事情。

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

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

我欢迎添加 lispish-mode 的补丁(如果它有一个更好的名字就更好了),但到目前为止,每次我看它时,我最终发现 Lispish 之间有太多差异有很多东西可以分享的模式。

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

  1. 更改添加到 lisp-mode-hook 的挂钩函数,以便它测试 (eq major-mode 'lisp-mode),因此不会在派生模式下执行。

  2. 禁用 lisp-mode-hook 而 运行 你的 parent:

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