从 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-mode
与 emacs-lisp-mode
的实现中得到启发。它们不是一个派生自另一个,而是不同的模式(每个派生自 prog-mode
)。他们的(独立)键映射有一个共享的 parent 键映射,但是,这意味着很多键绑定做同样的事情。
我建议使用该代码作为创建新 lisp-ish 主要模式的模板。
正确的方法是从 lisp-mode 的父级继承。理想情况下,应该有一个父 lispish-mode
被所有类似 Lisp 的主要模式使用,但目前没有这样的东西,所以你必须使用 prog-mode
然后手动 setup/copy 东西你想要 lisp-mode
.
我欢迎添加 lispish-mode
的补丁(如果它有一个更好的名字就更好了),但到目前为止,每次我看它时,我最终发现 Lispish 之间有太多差异有很多东西可以分享的模式。
我可以看到两种解决问题的方法
更改添加到 lisp-mode-hook
的挂钩函数,以便它测试 (eq major-mode 'lisp-mode)
,因此不会在派生模式下执行。
禁用 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."
...)
因此,我通过派生自标准 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-mode
与 emacs-lisp-mode
的实现中得到启发。它们不是一个派生自另一个,而是不同的模式(每个派生自 prog-mode
)。他们的(独立)键映射有一个共享的 parent 键映射,但是,这意味着很多键绑定做同样的事情。
我建议使用该代码作为创建新 lisp-ish 主要模式的模板。
正确的方法是从 lisp-mode 的父级继承。理想情况下,应该有一个父 lispish-mode
被所有类似 Lisp 的主要模式使用,但目前没有这样的东西,所以你必须使用 prog-mode
然后手动 setup/copy 东西你想要 lisp-mode
.
我欢迎添加 lispish-mode
的补丁(如果它有一个更好的名字就更好了),但到目前为止,每次我看它时,我最终发现 Lispish 之间有太多差异有很多东西可以分享的模式。
我可以看到两种解决问题的方法
更改添加到
lisp-mode-hook
的挂钩函数,以便它测试(eq major-mode 'lisp-mode)
,因此不会在派生模式下执行。禁用
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." ...)