byte-compile-disable-warning有什么作用?

时间:2012-11-16 15:26:12

标签: emacs elisp

无论论证是什么,它似乎都没有做任何事情。它也不会以任何方式影响字节编译警告。如果按照其描述使用。有没有如何使用它的例子?

例如,下面的代码:

(defmacro deflocal (var &rest body)
  (let ((symb var)
        (val (car body))
        (doc (cadr body)))
    `(progn
       (let ((byte-compile-warnings nil))
       ;; (byte-compile-disable-warning 'make-local)
       (set (make-local-variable ',symb) ,val)
       (put ',symb 'variable-documentation ,doc)
       ;; (byte-compile-enable-warning 'make-local)
       ))))

可以对byte-compile-warnings执行任何操作,并且它不会以任何方式影响编译器的输出(我仍然会收到有关赋予自由变量的警告。

修改

因为这在我上面的描述中是不透明的。这就是为什么我不想使用defvar。我有一个交互式函数,它将启动一些交互式shell,用于与Emacs之外的程序进行通信。这个shell可以由用户直接启动,间接进入几种不同的主要模式或执行其他任务时,如编译,检查语法等。该系统相当复杂。

我遇到过很多次,某些函数最终可能会在我不想要的缓冲区中设置变量。例如,当编译钩子调用一个函数,该函数假定它在拥有连接对象的缓冲区中被调用。连接可能会失败,因此一旦发现它因任何原因失败,系统就会尝试自动恢复连接(不幸的是,我必须连接的其他程序非常不稳定,而且其通信设施实施不当) 。因此,例如,如果flymake进程突然意识到它需要恢复连接,那么它将在该点处的flymake中创建它。同样,编译模式缓冲区,完成缓冲区,帮助缓冲区等。在这些上下文变化之后,非常很难遵循。

现在,当我可以确定没有其他缓冲区会意外地声明变量引用连接对象时,否则它会出错,我很安全,并且很容易调试并解决出现的问题。但是,一旦我使用defvar,过了一段时间我才意识到已经创建了一些胭脂重复的进程,而且我完全不知道是谁做的。

2 个答案:

答案 0 :(得分:5)

确实,byte-compile-warnings没有做你想要的。相反,您可能希望在某处用(defvar <VAR>)声明变量,或者在with-no-warnings中包装触发警告的代码。

代码中的byte-compile-warnings的let-binding将在代码运行时应用,而不是在编译时应用。


修改

这是一个简单的测试,可以确信只使用一个参数的defvar不会在任何地方绑定变量,如here所述:

(defvar foo)
(boundp 'foo) ;; -> nil

(defvar bar t)
(boundp 'bar) ;; -> t

答案 1 :(得分:2)

变量byte-compile-warnings最适合用作本地文件 变量来控制批处理期间输出的警告 编译。

听起来你很关心使用的副作用 defvar但它只创建一个动态的全局变量 绑定(除非变量已经在本地绑定)。

创建局部变量后,您可以使用make-local-variable 从一个函数内部来使变量缓冲区本地化 当前缓冲区但对所有其他缓冲区保持全局。所以,如果你 只有两个副本才能调用make-local-variable 变量,一个动态绑定并与所有缓冲区共享,以及 另一个特定于单个缓冲区的。 强调文字     (make-local-variable VARIABLE)

Make VARIABLE have a separate value in the current buffer.
Other buffers will continue to share a common default value.

如果您想确保没有全球版本的 你应该调查的变量 lexical binding

最后,在批量编译此.el时,只需清除警告 file将以下代码放在文件的底部:

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