如何处理 byte compile 期间的 obsolete function 警告?

我的包需要支持 26.3+,使用到了 org-show-entry,但是 Emacs 29 中使用报警:

elisp-demos.el:111:14: Warning: `org-show-entry' is an obsolete function (as
    of 9.6); use `org-fold-show-entry' instead.

但是我不用使用 org-fold-show-entry,因为它依赖 Emacs 29。有办法去掉这个警告吗?如果实在不行,不用管也 OK 的。

根据 org-fold-show-entry 是否定义来条件编译,比如

(funcall (eval-when-compile (if (fboundp 'org-fold-show-entry) #'org-fold-show-entry #'org-show-entry)) …)

我试了下,发现 #' 还是会触发 byte compiler 的检测,并报警:

去掉 # 能消除 Emacs 29 的警告:

(funcall (if (fboundp 'org-fold-show-entry)
                         #'org-fold-show-entry
                       'org-show-entry))

不过我这把两个 # 都拿掉了,不然 29 以下估计也有警告

那还可以

(eval-when-compile
  (defmacro wrap-org-show-entry (&rest args)
    `(,(if (fboundp 'org-fold-show-entry)
           'org-fold-show-entry
         'org-show-entry)
      ,@args)))
1 个赞

这毕竟要额外引入一个符号,感觉不如用 cl-macrolet。另外您睡得好晚哦

eval-when-compile 在编译完以后就没了,不会占用符号。cl-macrolet 如果只有一处用到那无所谓,也能用,但不编译的话也不比 defmacro 干净多少。另外我在北美。

1 个赞

这个是正解,更粗暴的是直接判断版本号,调用不同的函数。