Spacemacs下add-hook没起作用

(add-hook 'coffee-mode-hook
          (lambda ()
            (custom-set-variables
             '(coffee-tab-width 4)
             '(coffee-args-compile '("-c" "--no-header" "-bare")))
            (define-key coffee-mode-map [(meta r)] 'coffee-compile-buffer)
            (define-key coffee-mode-map (kbd "C-j") 'coffee-newline-and-indent)
            (add-hook 'after-save-hook 'coffee-compile-file nil t)))

没有报错,但就是没有效果?谁帮忙分析分析。代码段放在user-config里面的。

M-x describe-variable RET coffee-mode-hook RET 看一下有没有 (lambda () ...)的内容

lambda 前面是不是也要加一个 '

有的,起作用了,效果没出来,谢谢。

只是 tab-width 的设置没有起效吧,coffee-mode 把 coffee-tab-width 给设置为 buffer local var 了。

正确的做法是,把 custom-set-variable 放在外面,而且不要用代码维护 customized variables,应该使用 Emacs 的 Customize 界面来修改这样的变量。

还有在 major/minor mode map 上设置快捷键,我觉得最好不要在 hook 里设置,这样每有一个buffer启用这个mode,这个 define-key 都会被执行一遍,应该放在 with-eval-after-load 里面。

如果觉得像上面这样改比较麻烦的话,按照下面这样改一下,tab width 应该就能起效了:

(add-hook 'coffee-mode-hook
          (lambda ()
            (custom-set-variables
             '(coffee-args-compile '("-c" "--no-header" "-bare")))
            (setq-local coffee-tab-width 4)
            (define-key coffee-mode-map [(meta r)] 'coffee-compile-buffer)
            (define-key coffee-mode-map (kbd "C-j") 'coffee-newline-and-indent)
            (add-hook 'after-save-hook 'coffee-compile-file nil t)))