supprimer l'avertissement: affectation à une variable libre (et autres)

14

Comment puis-je supprimer l'avertissement "affectation à une variable libre" lors de la compilation d'octets d'un fichier lisp emacs?

En fait, je suis surtout intéressé à le supprimer pour un tampon spécifique lors de l'utilisation de flycheck, mais je comprends que cela ne fait que passer au compilateur d'octets.

Il serait également bon d'obtenir une liste de tous les avertissements / erreurs qui peuvent être supprimés.

MISE À JOUR :
Par souci d'exhaustivité, permettez-moi de préciser qu'il existe de nombreuses raisons (indépendantes du langage) de désactiver les avertissements du compilateur. Quelques exemples: pour faciliter la transition du code hérité dans un cadre renforcé, pour les fichiers de travail et les recettes à exécuter dans un contexte en direct, pour supprimer le bruit tout en corrigeant les problèmes de priorité supérieure, ou parce que le compilateur est tout simplement erroné.

fommil
la source
1
Ne supprimez pas ces avertissements, corrigez-les. Ils existent pour une raison.
lunaryorn
2
@lunaryorn non, ce sont des faux positifs.
fommil
1
Avec tout le respect que je vous dois, et sans avoir vu les avertissements spécifiques, je ne suis pas d'accord. Les fausses alertes de variables libres sont très rares, et si elles se produisent dans une quantité qui vous donnerait envie de les faire taire, j'ai du mal à croire qu'elles sont toutes de faux positifs. Je soupçonne fortement que ces avertissements indiquent des defvars manquants ou des requires manquants .
lunaryorn
3
Je suis désolé, mais à quelles "références liées" faites-vous référence?
lunaryorn
4
Lorsque vous décidez que "le compilateur est tout simplement faux", la bonne façon de faire taire cet avertissement est de déclarer la variable problématique avec (defvar the-variable). Cela met l'avertissement au silence uniquement pour cette variable, vous pouvez donc l'obtenir pour d'autres variables.
Malabarba

Réponses:

17

Pour le bénéfice des lecteurs désemparés qui arrivent ici, permettez-moi une petite digression pour dire que ces avertissements pointent généralement vers de vrais problèmes de code (et quand ils ne le font pas, vous pouvez les supprimer sur une base par variable) afin que les gens devraient rechercher ce qu'ils dire avant de les désactiver.

Bien sûr, je ne doute pas que vous sachiez pourquoi vous devez le désactiver, donc la réponse est ci-dessous.


La réponse

Afin de désactiver cet (ou autre) avertissement, vous devrez définir la valeur de byte-compile-warnings. Vous pouvez le faire en tant que variable locale de fichier en ajoutant l'extrait de code suivant à la fin du fichier.

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

Vous pouvez également définir cela globalement.

Vous pouvez remplacer (not free-vars)par (not free-vars callargs unresolved)et selon les autres avertissements que vous souhaitez supprimer. La liste complète des avertissements pouvant être inclus / supprimés se trouve sur la docstring de la variable (ci-dessous).

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
la source
Notez que Flycheck ne transfère pas un paramètre global pour cette variable au sous-processus du compilateur d'octets. Je ne sais même pas s'il évalue la variable locale.
lunaryorn
2
@lunaryorn Je pense que la version locale-var devrait fonctionner avec flycheck. Au moins, le compilateur d'octets prend généralement soin de lire les variables locales avant de compiler le fichier.
Malabarba
5
@fommil Désolé, je ne voulais pas paraître condescendant. J'ai écrit ce paragraphe parce que d'autres personnes pourraient atterrir ici quand elles recherchent cet avertissement sur Google, et je voulais qu'elles sachent que c'est une chose réelle (pas seulement quelque chose qu'elles devraient immédiatement désactiver). Il ne s'agit pas de propreté, c'est de correction (le code a une signification différente sans le defvar). Puisque vous n'avez pas mentionné pourquoi vous vouliez le désactiver, j'ai pensé qu'il valait la peine de mentionner que cela ne devrait pas être la première option.
Malabarba
6
@fommil Votre question ne contient aucune référence à un cas d'utilisation plus spécifique. Il se lit comme une question générale , et en tant que tel, soulignant qu'il n'est généralement pas (mais pas nécessairement spécifiquement dans votre cas) de désactiver tous les avertissements devrait faire partie de toute réponse complète sur la désactivation des avertissements, n'est-ce pas ? Vous n'êtes pas le seul à lire cette réponse et vous ne pouvez pas vous attendre à recevoir une réponse spécifique sur vos besoins spécifiques si vous ne les incluez pas dans votre question.
lunaryorn
1
@fommil J'ai reformulé ce premier paragraphe pour, je l'espère, le lire un peu mieux. Laissez-moi savoir ce que vous pensez.
Malabarba