3

字节编译 emacs lisp 非常有用,因为它会生成编译器警告,尽管有时很神秘,但总是指向错误或未完成的任务,例如缺少导入或未实现的函数。

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

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

例如,我正在使用后续代码来放置引发编译时消息的待办事项:

(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 ...])
4

2 回答 2

4

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

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

无论哪种方式,您都只能靠自己,搞乱 Emacs 的内部结构;SO是你唯一的朋友。:-)

于 2013-06-17T13:18:54.053 回答
2

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

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

要了解如何使用它,您必须了解它是通过返回一段特殊的代码来工作的,该代码使字节编译器稍后(当行信息可用时)发出消息。

于 2013-06-17T15:17:08.163 回答