【发布时间】:2016-03-28 18:45:30
【问题描述】:
所以我通过从标准 Lisp 模式派生来为自定义 lisp 创建了一个主要模式。但是,当 emacs 进入它时,它也会自动激活 slime-mode,这会覆盖我的大部分绑定。据我所知,这是因为 SLIME 使用 Lisp 模式注册了一些钩子,而我的模式也触发了它们,但我不确定。有没有办法避免这种情况?
【问题讨论】:
标签: emacs slime major-mode
所以我通过从标准 Lisp 模式派生来为自定义 lisp 创建了一个主要模式。但是,当 emacs 进入它时,它也会自动激活 slime-mode,这会覆盖我的大部分绑定。据我所知,这是因为 SLIME 使用 Lisp 模式注册了一些钩子,而我的模式也触发了它们,但我不确定。有没有办法避免这种情况?
【问题讨论】:
标签: emacs slime major-mode
如果您使用的是define-derived-mode,那么您的父模式的主体和模式挂钩将运行。
详情请参阅https://stackoverflow.com/a/19295380。
如果您在lisp-mode-hook 中启用slime-mode,并且您的新模式源自lisp-mode,那么最简单的事情就是禁用 @ 987654326@ 再次在派生模式的模式挂钩中。
编辑:实际上我相信你可以通过在你的模式的body中操作delayed-mode-hooks来阻止祖先模式的模式钩子运行。
(您无法阻止祖先模式的主体运行。)
不过,我建议您不要这样做。我认为,如果您发现自己想要弄乱派生模式机制(特别是如果您打算共享代码),那么您根本不应该使用派生模式。
您可能应该从 lisp-mode 与 emacs-lisp-mode 的实现中得到启发。它们不是一种从另一种派生的模式,而是不同的模式(每个模式都派生自prog-mode)。但是,它们的(独立)键映射具有共享的父键映射,这意味着许多键绑定执行相同的操作。
我建议使用该代码作为创建新的 lisp-ish 主要模式的模板。
【讨论】:
parent-mode 上的事情也会发生在child-mode 上。您当然不应该寻找阻止其他人的 lisp-mode 功能在这种情况下工作的方法。
derived-minor-mode,您将看到实际生成的代码。如果您仍然认为从 lisp-mode 派生有部分意义,您始终可以将其用作修改的基础。
正确的方法是从 lisp-mode 的父级继承。理想情况下,应该有一个父 lispish-mode 被所有类似 Lisp 的主要模式使用,但目前没有这样的东西,所以你必须使用 prog-mode 然后手动设置/复制你想要的东西从 lisp-mode .
我欢迎添加一个 lispish-mode 的补丁(如果它带有更好的名称,那就更好了),但到目前为止,每次我查看它时,我最终发现 Lispish 模式之间存在太多差异有很多可以分享的。
【讨论】:
add-mode-hook,它基本上与add-hook 工作相同,除了会有额外的参数用于挂钩不会被派生模式触发。
我可以看到解决问题的两种方法
更改添加到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."
...)
【讨论】: