字节编译 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 ...])
    

    最佳答案

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

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

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

    关于Emacs lisp : Generate compiler warnings,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17144703/

    10-12 06:25