无论论证是什么,它似乎都没有做任何事情。它也不会以任何方式影响字节编译警告。如果按照其描述使用。有没有如何使用它的例子?
例如,下面的代码:
(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
,过了一段时间我才意识到已经创建了一些胭脂重复的进程,而且我完全不知道是谁做的。
答案 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: