Warnung unterdrücken: Zuweisung an freie Variable (und andere)


14

Wie kann ich die Warnung "Zuweisung an freie Variable" beim Byte-Kompilieren einer Emacs-LISP-Datei unterdrücken?

Eigentlich bin ich hauptsächlich daran interessiert, es für einen bestimmten Puffer zu unterdrücken, wenn ich Flycheck verwende, aber ich verstehe, dass dies nur an den Byte-Compiler weitergegeben wird.

Es wäre auch gut, eine Liste aller Warnungen / Fehler zu erhalten, die unterdrückt werden können.

UPDATE : Lassen
Sie mich der Vollständigkeit halber klarstellen, dass es viele (sprachunabhängige) Gründe gibt, Compiler-Warnungen zu deaktivieren. Einige Beispiele: Erleichterung des Übergangs von Legacy-Code in ein fusselfreies Framework, Ausführen von Arbeitsdateien und Rezepten in einem Live-Kontext, Entfernen von Rauschen beim Beheben von Problemen mit höherer Priorität oder weil der Compiler einfach falsch ist.


1
Unterdrücken Sie diese Warnungen nicht, sondern beheben Sie sie. Sie existieren aus einem Grund.
Lunaryorn

2
@lunaryorn nein, sie sind falsch positiv.
13.

1
Bei allem Respekt und ohne die spezifischen Warnungen gesehen zu haben, würde ich dem nicht zustimmen. Falsche Warnungen für freie Variablen sind sehr selten, und wenn sie in einer Menge auftreten, die Sie zum Schweigen bringen würde, fällt es mir schwer zu glauben, dass sie alle falsch positiv sind. Ich vermute sehr, dass diese Warnungen auf fehlende defvaroder fehlende requires hinweisen .
Lunaryorn

3
Es tut mir leid, aber auf welche "verlinkten Referenzen" verweisen Sie?
Lunaryorn

4
Wenn Sie feststellen, dass "der Compiler einfach falsch ist", deklarieren Sie die problematische Variable mit (defvar the-variable). Dadurch wird die Warnung nur für diese Variable stummgeschaltet, sodass Sie sie weiterhin für andere Variablen abrufen können.
Malabarba,

Antworten:


17

Lassen Sie mich zum Wohle ahnungsloser Leser sagen, dass diese Warnungen im Allgemeinen auf echte Codeprobleme verweisen (und wenn nicht, können Sie sie pro Variable unterdrücken), sodass die Leute nachforschen sollten, was sie sind meine, bevor Sie sie deaktivieren.

Natürlich habe ich keinen Zweifel daran, dass Sie wissen, warum Sie es deaktivieren müssen, daher ist die Antwort unten.


Die Antwort

Um diese (oder eine andere) Warnung zu deaktivieren, müssen Sie den Wert von festlegen byte-compile-warnings. Sie können dies als dateilokale Variable ausführen, indem Sie das folgende Snippet am Ende der Datei hinzufügen.

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

Sie können dies auch global einstellen.

Sie können ersetzen (not free-vars)mit (not free-vars callargs unresolved)und je nachdem , was andere Warnungen Sie zu unterdrücken. Die vollständige Liste der Warnungen, die eingeschlossen / unterdrückt werden können, finden Sie in der Dokumentzeichenfolge der Variablen (siehe unten).

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.

Beachten Sie, dass Flycheck keine globale Einstellung für diese Variable an den Byte-Compiler-Unterprozess weiterleitet. Ich bin mir nicht mal sicher, ob es die lokale Variable auswertet.
Lunaryorn

2
@lunaryorn Ich denke die local-var Version sollte mit flycheck funktionieren. Zumindest achtet der Byte-Compiler normalerweise darauf, lokale Variablen zu lesen, bevor die Datei kompiliert wird.
Malabarba

5
@fommil Sorry, ich wollte nicht bevormunden klingen. Ich habe diesen Absatz geschrieben, weil andere Leute hier landen könnten, wenn sie diese Warnung googeln, und ich wollte, dass sie wissen, dass es eine echte Sache ist (nicht nur etwas, das sie sofort deaktivieren sollten). Es geht nicht um Sauberkeit, sondern um Korrektheit (Code hat ohne die Defvar eine andere Bedeutung). Da Sie nicht erwähnt haben, warum Sie es deaktivieren wollten, war es meiner Meinung nach erwähnenswert, dass es nicht die erste Option sein sollte.
Malabarba

6
@fommil Ihre Frage enthält keine Verweise auf einen spezifischeren Anwendungsfall. Es handelt sich um eine allgemeine Frage, die darauf hinweist, dass das Deaktivieren aller Warnungen im Allgemeinen ( in Ihrem Fall jedoch nicht unbedingt im Besonderen ) keine gute Idee ist ? Sie sind nicht der einzige, der diese Antwort liest, und Sie können nicht erwarten, eine spezifische Antwort auf Ihre spezifischen Bedürfnisse zu erhalten, wenn Sie diese nicht in Ihre Frage aufnehmen.
Lunaryorn

1
@fommil Ich habe diesen ersten Absatz umformuliert, um hoffentlich etwas besser zu lesen. Lass mich wissen was du denkst.
Malabarba
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.