使用上没有任何影响,不懂 elisp,不知道是什么问题?
flycheck不懂elisp,当他放屁就行了(真诚)
spacemacs不在elisp-mode里打开flycheck是有原因的
附:bind-key
包有个bind-keys
宏,不用重复写这么多bind-key
的
flymake 也是一样提示。
bind-key 不是 built-in 插件,我的按键定制不多就不改了。
flymake也不懂elisp,和flycheck倒是五十步笑一百步。(管的闲事没有flycheck多)
lisp的元编程能力强到过分,指望linter是不可能的。
我知道bind-key
是use-package的一部分,所以才知道有个bind-keys
的macro
因为 flycheck 检查 reference to undefined variable 需要运行时存在定义。很明显,你 lazy load 了 view,也就是现在没 load 过 view,自然Emacs 运行时不存在 view-mode-map 定义。
不是因为 meta programming 太强,而是多数 Lisp 实现得都很原始,连 CST 都没有,自然就算要 linter 也无从做起。
更深层次的问题,Emacs Lisp 缺少定义 API 的规范,全靠全局命名空间,运行时在没有载入具体文件时不会有哪个函数定义在哪里的知识,没错,用 autoload 可以做到类似的事,然而除了包作者认为的几个主要入口别的尤其是 mode map 这种都不会刻意去做 autoload,全靠 eval-after-load 这样的 ad hoc 玩意,能容易做 lint 才有鬼了
flycheck检查elisp有点严格了,但是还算好用。第一个错误是因为没有找到load-path,设置一个变量导入即可。反倒是flymake,根本配置不起来。
暂时不需要。
配置文件自己用的,可以宽松一些:
...
;; Local Variables:
;; byte-compile-warnings: (not free-vars)
;; flycheck-disabled-checkers: (emacs-lisp-checkdoc)
;; End:
;;; example.el ends here
或者写到 .dir-locals.el
写了个宏从根源上消除setq时变量尚未定义的问题
(require 'cl-lib)
(defmacro ^setq (&rest rest)
"Set each SYM to to the value of its VAL, if SYM is not defined, define it first."
(when (or (zerop (length rest))
(not (cl-evenp (length rest))))
(signal 'wrong-number-of-arguments
(list #'cl-evenp (length rest))))
`(eval-and-compile
,@(cl-loop
with defs = (copy-sequence rest)
while defs
for var = (pop defs)
for _val = (pop defs)
collect `(defvar ,var))
(setq ,@rest)))
-
这样会破坏变量的定义位置和 docstring。
-
本来
setq
就不需要先定义变量。
其实还是想让byte-compiler闭嘴。
docstring被覆盖这个问题是我疏忽了
Flycheck 检查来自于 Emacs Byte Compiler,大致等于
$ emacs -Q --batch -f batch-byte-compile init.el
第一个错误提示你没有给 Emacs 设置好相应的 load-path
,得像下面这个才行
$ emacs -Q --batch -L /path/to/use-package -f batch-byte-compile init.el
至于怎么给 Flycheck 的 Emacs 检查设置 load-path
得看文档,肯定会有选项让你设置。
第二个警告(不是错误)提示你 view-mode-map
没有定义,除非你 (require 'view)
,不然 Emacs 当然不会知道这个变量是否存在,你可以「手动」告诉 Byte Compiler 这个变量确确实实有定义:
(defvar view-mode-map)
(setq flycheck-emacs-lisp-load-path 'inherit )
错误确实消除了,舒服~