请教下显示 warning(bytecomp) 字节编译警告都是怎么处理的?


#1

就是从github拉取配置之后,打开emacs 就看到底下有编译的信息 1done 2skipped 之类的,然后打开之后就是这样有一个窗口显示字节编译的警告

然后rencentfiles里出现一堆elpa下的文件这个需要怎么解决。之前拉下来装完这里都是空的。不太懂请教各位


#2

编译产生的警告应该解决掉,比如 icons-in-terminal 有可能就是个 Bug,它的确没定义。

第二个 Recentf 的问题跟主题不相干,应该用一个单独主图。估计是 Recentf 的锅,它不能区分用户自己打开和程序打开的文件,一个 workaround 是设置 recentf-exclude 把这些文件排除掉。


#3

这么多错误都要解决掉吗。。


#4

是,能有这么多警告也不常见。


#5

好吧 可是我看编译警告很多我都没设置在配置里啊。


#6

看情况处理

  1. 自己配置里的byte-compiler warning,因为经常要在包加载前设置变量,或者手动编写胶水函数。如果要一个个认真处理,还挺麻烦的,所以一般我不处理,可以用一个.dir-locals.el让emacs不要多管闲事

这里我关闭了free-vars(引用自由变量)unresolved(使用运行时可能未定义的函数)obsolete(使用deprecated功能)的报警,然后关闭了flycheck的两个elisp checker。

  1. 别人写的package的byte-compiler warning,管不了,也没必要管,一般先用了再说,有问题就报bug

  2. 自己写的package有compiler warning,出于责任心,还是要处理一下的,而且byte-compiler不过的话不能过melpa的初审。

包里出warning大部分时候都是因为你写的代码有问题,当然也有可能存在false positive的情况,列举几个常见的

  1. 为了保持兼容性,原来需要5个参数的函数现在只需要4个,则不使用的参数会出现Unused lexical variable的报警,解决方式是用_前缀标记不使用的变量
(defun ignore (&rest _))
  1. 你把包A作为可选依赖,只有在安装了A的时候才启用附加功能。这时你不希望直接require A,但却希望在特定情况使用A内的一些函数和功能,这时可以用declare-functiondefvar来消除报警
(declare-function some-function "ext:A")
(defvar some-variable) ; Don't give it an initial value!
  1. 使用了(require 'cl), cl package 已被废弃,目前cl package内只有对应的到cl-lib package 的alias,使用下面的等价代码替换。当然最好直接使用cl-lib
(eval-when-compile (require 'cl))
(require 'cl-lib)