add-hook怎么写才是对的?

(require 'flycheck-swift3)
(with-eval-after-load 'flycheck
  (add-hook 'flycheck-mode-hook #'flycheck-swift3-setup))

(require 'flycheck-swift3) ; Not necessary if using ELPA package
(with-eval-after-load 'flycheck
  (add-hook 'flycheck-mode-hook 'flycheck-swift3-setup))

这两种哪种是对的?我在一些配置指南上看到了这两种情况都有的例子,那么加了个#号有什么区别?

都是对的。

add-hook 没必要放在 with-eval-after-load 里面

1 个赞

可写可不写。写的好处是 #' 可以作为标记,让人一眼就能看出这个位置是个函数,不是别的东西。并且 Byte Compiler 在编译期间会检测这个函数是否有定义,如果没有的话(比如你犯了个 typo 错误的话),你会被告知:

~$ cat a.el
(with-eval-after-load 'flycheck
  (add-hook 'flycheck-mode-hook 'flycheck-swift3-setup))
~$ diff -u a.el b.el
--- a.el	2017-06-04 00:21:41.000000000 +0800
+++ b.el	2017-06-04 00:21:41.000000000 +0800
@@ -1,2 +1,2 @@
 (with-eval-after-load 'flycheck
-  (add-hook 'flycheck-mode-hook 'flycheck-swift3-setup))
+  (add-hook 'flycheck-mode-hook #'flycheck-swift3-setup))
~$ emacs --batch -f batch-byte-compile a.el
~$ emacs --batch -f batch-byte-compile b.el

In end of data:
b.el:3:1:Warning: the function ‘flycheck-swift3-setup’ is not known to be
    defined.

不写的好处是可以少打一个字,而且 Function Quote #'似乎是比较新的 Emacs 才有的,比如说 Emacs 22.1(2007 年)就没有这个功能。

2 个赞