配置文件出现两条 flycheck 错误,怎么处理?

Screenshot_20190108_143014

使用上没有任何影响,不懂 elisp,不知道是什么问题?

flycheck不懂elisp,当他放屁就行了(真诚) :joy:

spacemacs不在elisp-mode里打开flycheck是有原因的

附:bind-key包有个bind-keys宏,不用重复写这么多bind-key

flymake 也是一样提示。

bind-key 不是 built-in 插件,我的按键定制不多就不改了。

flymake也不懂elisp,和flycheck倒是五十步笑一百步。(管的闲事没有flycheck多)

lisp的元编程能力强到过分,指望linter是不可能的。

我知道bind-keyuse-package的一部分,所以才知道有个bind-keys的macro :smile:

因为 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 才有鬼了

1 个赞

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)))
  1. 这样会破坏变量的定义位置和 docstring。

  2. 本来 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)
2 个赞

(setq flycheck-emacs-lisp-load-path 'inherit )

错误确实消除了,舒服~

1 个赞