Emacs 字节编译禁用警告的作用是什么?

Emacs 字节编译禁用警告的作用是什么?,emacs,elisp,Emacs,Elisp,不管争论是什么,它似乎根本没有任何作用。它也不会以任何方式影响字节编译警告。如果根据其说明使用。有没有关于如何使用它的例子 例如,下面的代码: (defmacro deflocal (var &rest body) (let ((symb var) (val (car body)) (doc (cadr body))) `(progn (let ((byte-compile-warnings nil)) ;; (by

不管争论是什么,它似乎根本没有任何作用。它也不会以任何方式影响字节编译警告。如果根据其说明使用。有没有关于如何使用它的例子

例如,下面的代码:

(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)
       ))))
它可以做任何它想做的事情来编译警告,并且它不会以任何方式影响编译器的输出(我仍然收到关于分配给自由变量的警告)

编辑:

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

我曾多次遇到某些函数最终可能会在我不想要的缓冲区中设置变量。例如,当编译钩子调用一个函数时,该函数假定它是在拥有连接对象的缓冲区中调用的。连接可能会失败,因此一旦连接断开,系统将尝试自动恢复连接由于任何原因失败的vers(不幸的是,我必须连接的另一个程序非常不稳定,它的通信设施执行得很差)。因此,例如,如果flymake进程突然意识到它需要恢复连接,它将在flymake当时的任何缓冲区中创建连接。类似地,编译模式缓冲区、完成缓冲区、帮助缓冲区等等。在这些上下文更改之后,很难跟踪


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

事实上,
字节编译警告
并不能满足您的需要。相反,您可能需要在某个地方声明带有
(defvar)
的变量,或者将触发警告的代码封装在没有警告的

代码中
字节编译警告的let绑定将在代码运行时应用,而不是在编译时应用


编辑:

下面是一个简单的测试,可以确信只使用一个参数的
defvar
不会到处绑定变量,如下所述:

(defvar foo)
(蹦蹦跳跳);;->零
(倾斜杆t)
(边界条);;->t

变量
字节编译警告
最好用作本地文件 变量来控制批处理期间输出的警告 编译

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

创建局部变量后,可以使用
make local variable
在函数中,使变量缓冲区成为 当前缓冲区,但对所有其他缓冲区保持全局 仅调用
make local variable
一次将只有两份 变量,一个动态绑定并与所有缓冲区共享,以及 特定于单个缓冲区的另一个缓冲区。 强调文本 (使局部变量变为变量)

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

最后,在批量编译此
.el
文件在文件底部放置以下代码:

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

我编辑了我的答案,在
.el
文件中正确地使用了
字节编译警告
。也许你可以在编译时使用
eval欺骗它,可能在那里使用
defvar
。我不是100%确定,但这可能会将变量定义为全局变量,但只有在编译文件时。我认为使用
defv无第二个参数的ar
在您的情况下可能是一个选项:它不会创建或初始化任何变量,只会告诉Emacs您想将此符号用作变量。例如,请参阅。不,如果不指定第二个参数,它实际上不会被绑定。这是我在上面链接的问题中没有理解的,直到@Step韩证明我错了。我编辑了答案以提供一个例子;希望在同行评议时你能看到。
;; Local Variables:
;; byte-compile-warnings: (not free-vars)
;; End: