Emacs lisp:生成编译器警告

时间:2013-06-17 09:51:32

标签: emacs macros elisp compiler-warnings

编辑emacs lisp的字节非常有用,因为它会生成编译器警告,虽然有时含糊不清,但始终指向错误或未完成的任务,例如缺少导入或未实现的函数。

但是,我找不到一种方法来生成自定义编译器警告,这些警告与*Compile-Log*缓冲区很好地集成,即显示错误的位置,如

mymodule.el:247:1:Warning: Unused lexical variable `file-name'

E.g。我正在使用后续代码来放置引发编译时消息的待办事项:

(eval-when-compile 
  (defmacro TODO (string)
    `(eval-when-compile 
       (message "TODO: %s" ,string))))

但是,我找不到在

上添加信息的方法(在编译时)
  • 文件名
  • 行号

在加载时,变量load-file-name可用,但在编译时它是nil。变量default-directory在编译时定义,但在这种情况下没有帮助。

对于行号我根本不知道任何方法。

当使用(warn ...)代替时,我会得到类似

的内容
Warning (emacs): TODO: Complete or remove

即。根本没有位置信息。如果我使用(error ...),我会自动显示行号等,但编译停止而不是显示所有错误和警告,因此它也不是可行的解决方案。

更新

部分解决方案似乎是

(funcall (if byte-compile-current-file 'byte-compile-warn 'warn) FORMAT [ARGS ...])

2 个答案:

答案 0 :(得分:4)

您需要使用内部变量byte-compile-current-file(正在编译的文件的名称)和byte-compile-read-position(最后read开头的字符位置)。

或者,您可以尝试在byte-compile-warning-prefix缓冲区中插入 file:line前缀的函数*Warnings*

无论哪种方式,你都是自己的,搞乱了Emacs的内部;这是你唯一的朋友。 : - )

答案 1 :(得分:2)

确实,这是一个问题。甚至byte-compile-read-position也相当差,因为当宏扩展时它还不是最新的。在Emacs的主干中有macroexp--warn-and-return,而--暗示,它目前仍被认为是内部的。 E.g。

(defmacro TODO (string)
  (macroexp--warn-and-return
    (format "TODO: %s" string)
    nil))

要了解如何使用它,您必须了解它的工作原理是返回一段特殊的代码,使稍后的字节编译器(当line-info可用时)发出消息。