suprimir advertencia: asignación a variable libre (y otras)

14

¿Cómo puedo suprimir la advertencia de "asignación a variable libre" cuando byte compila un archivo emacs lisp?

En realidad, estoy principalmente interesado en suprimirlo para un búfer específico cuando utilizo flycheck, pero entiendo que esto solo está pasando al compilador de bytes.

También sería bueno obtener una lista de todas las advertencias / errores que se pueden suprimir.

ACTUALIZACIÓN :
En aras de la exhaustividad, permítanme aclarar que hay muchas razones (independientes del lenguaje) para deshabilitar las advertencias del compilador. Algunos ejemplos: para facilitar la transición del código heredado a un marco forzado con pelusa, para que los archivos de rascado y las recetas se ejecuten dentro de un contexto en vivo, para eliminar el ruido mientras se solucionan los problemas de mayor prioridad, o porque el compilador está equivocado.

fommil
fuente
1
No suprimas estas advertencias, arréglalas. Existen por una razón.
lunaryorn
2
@lunaryorn no, son falsos positivos.
fommil
1
Con el debido respeto, y sin haber visto las advertencias específicas, no estaría de acuerdo. Las advertencias de variables libres falsas son muy escasas, y si ocurren en una cantidad que haría querer silenciarlas, me resulta difícil creer que todas ellas sean falsos positivos. Sospecho firmemente que estas advertencias indican falta de defvars o falta de requires.
lunaryorn
3
Lo siento, pero ¿a qué "referencias vinculadas" se refiere?
lunaryorn
44
Cuando decide que "el compilador está equivocado", la forma correcta de silenciar esta advertencia es declarar la variable problemática con (defvar the-variable). Esto silencia la advertencia solo para esa variable, por lo que aún puede obtenerla para otras variables.
Malabarba

Respuestas:

17

Para el beneficio de los lectores despistados que llegan aquí, permítanme una pequeña digresión para decir que estas advertencias generalmente apuntan a problemas de código reales (y cuando no lo hacen, puede suprimirlos en función de cada variable) para que la gente investigue qué significa antes de deshabilitarlos.

Por supuesto, no tengo dudas de que sabes por qué necesitas desactivarlo, por lo que la respuesta está a continuación.


La respuesta

Para deshabilitar esta (u otra) advertencia, deberá establecer el valor de byte-compile-warnings. Puede hacer esto como una variable local de archivo agregando el siguiente fragmento al final del archivo.

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

También puede configurar esto globalmente.

Se puede reemplazar (not free-vars)con (not free-vars callargs unresolved)y lo que otras advertencias desea suprimir. La lista completa de advertencias que se pueden incluir / suprimir se encuentra en la cadena de documentación de la variable (a continuación).

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.
Malabarba
fuente
Tenga en cuenta que Flycheck no reenvía una configuración global para esta variable al subproceso del compilador de bytes. Ni siquiera estoy seguro de si evalúa la variable local.
lunaryorn
2
@lunaryorn Creo que la versión local-var debería funcionar con flycheck. Al menos, el compilador de bytes generalmente se encarga de leer las variables locales antes de compilar el archivo.
Malabarba
55
@fommil Lo siento, no quise sonar condescendiente. Escribí ese párrafo porque otras personas podrían aterrizar aquí cuando googleen esta advertencia, y quería que supieran que es algo real (no solo algo que deberían deshabilitar de inmediato). No se trata de limpieza, se trata de corrección (el código tiene un significado diferente sin el defvar). Como no mencionaste por qué querías deshabilitarlo, pensé que valía la pena mencionar que no debería ser la primera opción.
Malabarba
66
@fommil Su pregunta no incluye ninguna referencia a un caso de uso más específico. Se lee como una pregunta general y, como tal, señala que generalmente (pero no necesariamente específicamente en su caso) no es una buena idea deshabilitar todas las advertencias, tendría que ser parte de una respuesta completa sobre la desactivación de las advertencias, ¿no? ? No es el único que lee esta respuesta y no puede esperar recibir una respuesta específica sobre sus necesidades específicas si no las incluye en su pregunta.
lunaryorn
1
@fommil Reescribí ese primer párrafo para leer un poco mejor. Déjame saber lo que piensas.
Malabarba