【问题标题】:How do I override a prelude module hook on coffee-mode?如何覆盖咖啡模式的前奏模块挂钩?
【发布时间】:2014-05-15 13:24:38
【问题描述】:

我已经使用prelude 大约一年了,并且开发了一个不错的设置。我开始编写咖啡脚本并尝试使用prelude-coffee module。这包含以下行:

(setq coffee-command "~/dev/coffee")

这在我的机器上不正确。我想改成:

(setq coffee-command "coffee")

现在显然我可以简单地更改这一行并完成它,但我喜欢将所有更改保留在 personal 文件夹中,以便于更新和保持我的点文件在我的所有机器上同步。

我尝试通过以下方式覆盖它:

(setq coffee-mode "coffee")
(eval-after-load 'coffee-mode
  (setq coffee-command "coffee"))

(add-hook 'prelude-coffee-mode-hook (setq coffee-command "coffee"))
(add-hook 'coffee-mode-hook (setq coffee-command "coffee"))

但这些都不起作用。更改需要在似乎使用eval-after-load 运行的另一个文件之后运行。

额外信息为了完整起见,我将在此处复制 prelude-coffee.el 文件:

(require 'prelude-programming)

(eval-after-load 'coffee-mode
  '(progn
     (defun prelude-coffee-mode-defaults ()
       "coffee-mode-defaults"

       ;; CoffeeScript uses two spaces.
       (setq coffee-tab-width 2)

       ;; If you don't have js2-mode
       (setq coffee-js-mode 'javascript-mode)

       ;; If you don't want your compiled files to be wrapped
       (setq coffee-args-compile '("-c" "--bare"))

       ;; *Messages* spam
       (setq coffee-debug-mode t)

       ;; Emacs key binding
       (define-key coffee-mode-map [(meta r)] 'coffee-compile-buffer)

       ;; Riding edge.
       (setq coffee-command "~/dev/coffee")

       ;; Compile '.coffee' files on every save
       (and (buffer-file-name)
            (file-exists-p (buffer-file-name))
            (file-exists-p (coffee-compiled-file-name (buffer-file-name)))
            (coffee-cos-mode t)))

     (setq prelude-coffee-mode-hook 'prelude-coffee-mode-defaults)

     (add-hook 'coffee-mode-hook (lambda ()
                                   (run-hooks 'prelude-coffee-mode-hook)))))
(provide 'prelude-coffee)

总之,我如何覆盖咖啡模式挂钩上发生的事情?

【问题讨论】:

  • 不确定这是否是问题所在,但您的eval-after-load 引用不足。像(eval-after-load 'coffee-mode '(setq coffee-command "coffee")) 一样写(setq 之前的额外单引号)或者如果您的 Emacs 足够新,则使用 with-eval-after-load
  • @legoscia 谢谢。我试着像你说的那样引用它,但不幸的是这没有帮助,(感谢你告诉我应该怎么做)我也应该引用其他行吗?编辑:似乎引用其他行并没有真正做任何事情。

标签: emacs elisp emacs-prelude


【解决方案1】:

哦,这太可怕了。我会提出一个关于前奏的问题。至少它 应该在设置coffee-command之前检查是否存在。

这条线很近

(add-hook 'prelude-coffee-mode-hook (setq coffee-command "coffee"))

试试这个:

(add-hook 'prelude-coffee-mode-hook (lambda () (setq coffee-command "coffee")))

我发现prelude-coffee.el 的其他问题:

您不能在钩子上使用 setq 并清除所有以前添加的钩子。那是不文明的。

【讨论】:

  • 嗯...这似乎对我也不起作用。 @legoscia 你能详细说明你的意思吗?以及修复前奏的好点,我将弄清楚如何测试存在,然后将其放入 PR 中。
  • add-hook 默认在钩子变量的前面添加新的钩子,在本例中为prelude-coffee-mode-hook。也就是说,prelude-coffee-mode-defaults 将在 设置正确值的函数之后执行,从而撤消其工作。如果您将t 作为第三个参数传递给add-hook(即(add-hook 'prelude-coffee-mode-hook (lambda () (setq coffee-command "coffee")) t)),那么它将最后添加新函数,这应确保它覆盖前奏函数。
  • @legoscia 嗯......这似乎也不起作用,哦,我已经对前奏进行了更改,现在正在提交 PR,所以我想这并不重要。
  • 当然,这段代码的实际问题是有setq是一个钩子。不知道这是如何进入 Prelude 的,但由于我不使用咖啡脚本,我想我最初提交或类似的东西时并没有太在意。我会清理代码。
猜你喜欢
  • 2023-03-08
  • 1970-01-01
  • 2016-12-28
  • 2016-10-29
  • 2012-10-12
  • 2013-08-24
  • 2017-05-05
  • 2013-06-15
  • 2018-10-31
相关资源
最近更新 更多