之前我用基于flymake开发的插件,但不很稳定,而且flymake的api变动比较多,我有点跟不上了,所以想试试flycheck,发觉入门不难,性能也比我想象的好, 以下是我的配置,
(with-eval-after-load 'flycheck
;; 为了高性能所以只在保存代码时检查
(setq flycheck-check-syntax-automatically '(save mode-enabled))
;; 界面尽量简洁,在边栏报错的功能都关掉了.
(setq flycheck-indication-mode nil)
;; 加了一个支持luau语言的syntax checker, "flycheck.el"里可以翻到各种例子
;; luau-analyze比较简陋,不会自动到父目录里找配置文件".luaurc",所以我还要
;; 设置`:working-directory`,一般不用搞这么复杂,
(flycheck-define-checker luau-analyze
"A Luau syntax checker using luau-analyze.
See URL `https://github.com/luau-lang/luau'."
;; `source-original` 表示直接检查原始代码文件, 也有其他的检查方式,
;; 常见的是检查当前buffer的内容,然后喂给命令行工具的stdin
;; 但luau-analyze不支持从stdin拿数据,
:command
("luau-analyze" "--formatter=plain" source-original)
;; `:error-patterns`的设置最后会转换成regex
:error-patterns
((warning line-start
(file-name)
":" line ":" column "-" end-column
": (" (id "W" (one-or-more digit)) ") "
(message) line-end)
(error line-start
(file-name)
":" line ":" column "-" end-column
": (" (id "E" (one-or-more digit)) ") "
(message) line-end))
:working-directory
(lambda (checker)
(ignore checker)
(when buffer-file-name
(or (locate-dominating-file buffer-file-name ".luaurc")
(file-name-directory buffer-file-name))))
:modes (lua-mode lua-ts-mode)))
针对luau语言启用luau-analyze的checker很简单,直接在".dir-locals.el"指定flycheck-checker,或lua-mode-hook里写一行(setq-local flycheck-checker 'luau-analyze), 以下是我的".dir-locals.el",
((lua-mode . ((flycheck-checker . luau-analyze)))
(lua-ts-mode . ((flycheck-checker . luau-analyze))))