我正在尝试使用自定义初始化函数使 flymake 工作。首先,我需要它来使它在 linux 内核源代码上工作。我找到了一个stackoverflow 答案,它在项目的根目录中创建了一个 flymake.mk 并让 flymake 查找该文件,该文件仅包含 make 配方检查语法。
当然那没有用。Flymake 日志 说:*** No rule to make target 'check-syntax'. Stop.
所以我做了一个更简单的项目,只有一个 file.c 和一个 Makefile,使用默认的 flymake,效果很好。所以我从 Makefile 中删除了 check-syntax 部分,并将其放在 flymake.mk 中,所有三个文件都在同一个目录中。现在再次使用自定义初始化并且也不起作用。首先,我尝试查看是否选择了自定义 init,并且确实如此,当我运行时,(flymake-proc--get-file-name-mode-and-masks buffer-file-name)
我得到了预期的结果:(flymake-kernel-make-init)
,但是当我运行时flymake-mode
,“No rule to make target 'check-syntax'”错误产生然后当我(flymake-proc--get-file-name-mode-and-masks buffer-file-name)
再次跑步时,我得到了零。这没有任何意义,因为 flymake-proc--get-file-name-mode-and-masks 仅取决于具有正则表达式和初始化函数的 alist。
有什么线索吗?
这是配置和flymake.mk
(use-package flymake
:config
;; Build a custom command-line using flymake.mk
(defun flymake-get-kernel-make-cmdline (source base-dir)
(list "make"
(list "-s"
"-f"
"flymake.mk"
"-C"
base-dir
(concat "CHK_SOURCES=" source)
"SYNTAX_CHECK_MODE=1"
"check-syntax")))
;; Search for flymake.mk to locate kernel tree base
(defun flymake-kernel-make-init ()
(flymake-proc-simple-make-init-impl
'flymake-create-temp-inplace t t
"flymake.mk"
'flymake-get-kernel-make-cmdline))
;; Register against .c files under /linux/ or /kernel/
;; Since the list is parsed in order use `push`
(push '(".*" flymake-kernel-make-init) flymake-proc-allowed-file-name-masks))
正则表达式是故意的,只是为了确保它可以工作。
.PHONY: check-syntax
check-syntax:
make -f Makefile $(patsubst %_flymake.o,%.o,$(patsubst %.c,%.o,$(CHK_SOURCES)))
如果我make -s -f flymake.mk -C ./ CHK_SOURCES=test.c SYNTAX_CHECK_MODE=1 check-syntax
从外壳运行它,这将有效