【问题标题】:Derive from Lisp Mode, ignoring its hooks?从 Lisp 模式派生,忽略它的钩子?
【发布时间】:2016-03-28 18:45:30
【问题描述】:

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

【问题讨论】:

    标签: emacs slime major-mode


    【解决方案1】:

    如果您使用的是define-derived-mode,那么您的父模式的主体和模式挂钩将运行。

    详情请参阅https://stackoverflow.com/a/19295380

    如果您在lisp-mode-hook 中启用slime-mode,并且您的新模式源自lisp-mode,那么最简单的事情就是禁用 @ 987654326@ 再次在派生模式的模式挂钩中。


    编辑:实际上我相信你可以通过在你的模式的body中操作delayed-mode-hooks来阻止祖先模式的模式钩子运行。

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

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

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

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

    【讨论】:

    • 嗯,这解决了我碰巧遇到的问题的一个特定实例,但其他人可能有不同的 Lisp 模式挂钩,会再次破坏某些东西......有没有更通用的解决方案来防止这个,除了复制 Lisp 模式而不是从它派生吗?
    • 不,派生模式的全部意义在于它们建立在彼此之上,所有发生在parent-mode 上的事情也会发生在child-mode 上。您当然不应该寻找阻止其他人的 lisp-mode 功能在这种情况下工作的方法。
    • 如果您将调用宏扩展为derived-minor-mode,您将看到实际生成的代码。如果您仍然认为从 lisp-mode 派生有部分意义,您始终可以将其用作修改的基础。
    • 坦率地说,我不明白为什么我不应该阻止其他人的 lisp 模式功能在一种完全不同的语言模式下工作,而这种语言恰好使用 S 表达式。它是从 lisp-mode 派生的,意味着实现细节......但是,由于似乎没有干净的解决方法,我会按照你的建议做。
    【解决方案2】:

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

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

    【讨论】:

    • 这个问题不仅出现在 lisp 模式中,例如this one 用于文本模式;由于从 csharp-mode 派生的 vala-mode,我在当地偶然发现了它。我想知道正确的解决方案是否宁愿添加一个函数add-mode-hook,它基本上与add-hook 工作相同,除了会有额外的参数用于挂钩不会被派生模式触发。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-26
      相关资源
      最近更新 更多