禁止警告:分配给自由变量(和其他变量)


14

字节编译emacs lisp文件时,如何抑制“分配给自由变量”警告?

实际上,我最感兴趣的是在使用flycheck时将其抑制为特定缓冲区,但是我知道这只是传递给字节编译器。

获取所有可以抑制的警告/错误的列表也将是一件好事。

更新
为了完整起见,请允许我澄清禁用编译器警告的原因很多(与语言无关)。一些示例:简化将旧代码转换为lint强制框架的过程,以便在实时上下文中运行草稿文件和配方,在解决较高优先级问题的同时消除噪声,或者因为编译器是错误的。


1
不要抑制这些警告,请加以解决。它们存在是有原因的。
lunaryorn

2
@lunaryorn不,它们是误报。
fommil

1
在所有适当的尊重下,并且没有看到具体的警告,我不同意。虚假的自由变量警告非常少见,如果发生的次数足以使您想让它们静默,那么我很难相信它们都是假阳性。我强烈怀疑这些警告确实表示缺少defvarrequire
lunaryorn

3
抱歉,您指的是什么“链接引用”?
lunaryorn

4
当您确定“编译器错误”时,使此警告静音的正确方法是使用声明有问题的变量(defvar the-variable)。这仅使该变量的警告静音,因此您仍然可以将其用于其他变量。
马拉巴巴

Answers:


17

为了让笨拙的读者到达这里,请允许我作一点题外话:这些警告通常都指向实际的代码问题(如果没有,您可以逐个变量地加以抑制),那么人们应该研究它们的内容。禁用它们之前的意思。

当然,我毫不怀疑您知道为什么需要禁用它,因此答案如下。


答案

为了禁用此(或其他)警告,您需要设置的值byte-compile-warnings。您可以通过将以下代码段添加到文件末尾作为文件本地变量来执行此操作。

;; Local Variables:
;; byte-compile-warnings: (not free-vars)
;; End:

您也可以全局设置。

您可以(not free-vars)(not free-vars callargs unresolved)和替换任何要禁止的其他警告。可以包括/禁止的警告的完整列表在变量的文档字符串中(如下)。

byte-compile-warnings is a variable defined in `bytecomp.el'.
Its value is t

  This variable is safe as a file local variable if its value
  satisfies the predicate which is a byte-compiled expression.

Documentation:
List of warnings that the byte-compiler should issue (t for all).

Elements of the list may be:

  free-vars   references to variables not in the current lexical scope.
  unresolved  calls to unknown functions.
  callargs    function calls with args that don't match the definition.
  redefine    function name redefined from a macro to ordinary function or vice
              versa, or redefined to take a different number of arguments.
  obsolete    obsolete variables and functions.
  noruntime   functions that may not be defined at runtime (typically
              defined only under `eval-when-compile').
  cl-functions    calls to runtime functions (as distinguished from macros and
                  aliases) from the old CL package (not the newer cl-lib).
  interactive-only
          commands that normally shouldn't be called from Lisp code.
  lexical     global/dynamic variables lacking a prefix.
  make-local  calls to make-variable-buffer-local that may be incorrect.
  mapcar      mapcar called for effect.
  constants   let-binding of, or assignment to, constants/nonvariables.
  suspicious  constructs that usually don't do what the coder wanted.

If the list begins with `not', then the remaining elements specify warnings to
suppress.  For example, (not mapcar) will suppress warnings about mapcar.

请注意,Flycheck不会将此变量的全局设置转发给字节编译器子进程。我什至不知道它是否计算局部变量。
lunaryorn

2
@lunaryorn我认为local-var版本应该与flycheck一起使用。至少,字节编译器通常会在编译文件之前注意读取局部变量。
马拉巴巴

5
@fommil对不起,我不是想发出光顾的声音。我写该段落的原因是,其他人在搜索此警告时可能会落在这里,我希望他们知道这是真实的(不仅仅是他们应该立即禁用的内容)。这与清洁度无关,而与正确性有关(没有defvar的代码具有不同的含义)。由于您没有提到为什么要禁用它,因此我认为值得一提的是它不应该是首选。
马拉巴巴

6
@fommil您的问题不包括对特定用例的任何引用。它读为一个一般性问题,因此,指出禁用所有警告不是一个好主意,但这通常是(但不一定要针对您的情况),这必须是有关禁用警告的完整答案的一部分,不是吗? ?您不是唯一阅读此答案的人,而且如果您的问题中未包含这些答案,您就无法期望得到有关您的特定需求的具体答案。
lunaryorn

1
@fommil我已将第一段改写为希望阅读得更好一些。让我知道你的想法。
马拉巴巴
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.