编辑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 ...])
答案 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可用时)发出消息。