Emacs 如何在咖啡模式下覆盖前奏模块挂钩?

Emacs 如何在咖啡模式下覆盖前奏模块挂钩?,emacs,elisp,emacs-prelude,Emacs,Elisp,Emacs Prelude,我已经使用了大约一年,并开发了一个很好的设置。我开始写咖啡剧本,并尝试使用。这包含以下行: (setq coffee-command "~/dev/coffee") 这在我的机器上是不正确的。我想把它改为: (setq coffee-command "coffee") 现在很明显,我可以简单地更改这一行并完成它,但我喜欢将所有更改保存在个人文件夹中,以便于在我的所有机器上轻松更新和保持我的点文件同步 我已尝试通过以下方式覆盖它: (setq coffee-mode "coffee") (ev

我已经使用了大约一年,并开发了一个很好的设置。我开始写咖啡剧本,并尝试使用。这包含以下行:

(setq coffee-command "~/dev/coffee")
这在我的机器上是不正确的。我想把它改为:

(setq coffee-command "coffee")
现在很明显,我可以简单地更改这一行并完成它,但我喜欢将所有更改保存在
个人
文件夹中,以便于在我的所有机器上轻松更新和保持我的点文件同步

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

(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
运行

额外信息为了完整起见,我将在此处复制
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)

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

哦,天哪,这太糟糕了。我会在序言中提出一个问题。至少是这样 在设置
coffee命令之前,应检查是否存在

这条线很近

(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,而只是删除所有以前添加的钩子。这是不文明的。

不确定这是否是问题所在,但您的
eval-after-load
引用不足。像
(加载后评估“咖啡模式”(setq coffee命令“coffee”)
(在
setq
之前加上一个引号)那样编写,或者如果您的Emacs足够新,则在加载后评估时使用
。@legoscia谢谢。我试着像你说的那样引用这句话,但不幸的是,这没用,(谢谢你告诉我应该怎么做),我应该引用其他的话吗?编辑:引用其他行似乎没有什么作用。我想您需要将非nil第三个参数传递给
addhook
,以便将此函数置于hook变量中的
prelude coffee mode defaults
之后。嗯。。。这似乎对我也不起作用@莱戈西亚,你能详细解释一下你的意思吗?修复prelude的好处是,我将找出如何测试是否存在,然后将其放入PR中。默认情况下,添加钩子
在钩子变量的前面添加新钩子,在本例中,
prelude咖啡模式钩子
。也就是说,
prelude coffee mode defaults
将在设置正确值的函数之后执行,从而撤消其工作。如果将
t
作为第三个参数传递给
add hook
(即
(add hook'prelude coffee mode hook(lambda()(setq coffee命令“coffee”))t
),则它将最后添加新函数,这将确保它覆盖prelude函数。@legocia Hmmm。。。这似乎也不起作用,哦,我已经对prelude做了更改,现在正在提交PR,所以我想这没什么大不了的。当然,这段代码的实际问题是有
setq
是一个钩子。不知道这是怎么进入序曲的,但由于我不使用咖啡脚本,我想我在最初提交或类似的时候并没有太多注意。我会清理代码。