sopprimere avviso: assegnazione a variabile libera (e altre)


14

Come posso sopprimere l'avviso "assegnazione a variabile libera" quando il byte compila un file lisp emacs?

In realtà sono principalmente interessato a sopprimerlo per un buffer specifico quando si utilizza il flycheck, ma capisco che questo sta passando al compilatore di byte.

Sarebbe anche utile ottenere un elenco di tutti gli avvisi / errori che possono essere eliminati.

AGGIORNAMENTO :
Per completezza, consentitemi di chiarire che ci sono molte ragioni (agnostiche del linguaggio) per disabilitare gli avvisi del compilatore. Alcuni esempi: per facilitare la transizione del codice legacy in un framework forzato, per l'esecuzione di file e ricette in un contesto live, per rimuovere il rumore risolvendo problemi con priorità più elevata o perché il compilatore è semplicemente sbagliato.


1
Non eliminare questi avvisi, correggili. Esistono per un motivo.
lunaryorn,

2
@lunaryorn no, sono falsi positivi.
fommil

1
Con tutto il rispetto e senza aver visto gli avvertimenti specifici, non sarei d'accordo. I falsi avvisi con variabili libere sono molto scarsi e, se accadono in quantità tale da indurli a zittirli, trovo difficile credere che siano tutti falsi positivi. Sospetto fortemente che questi avvertimenti indichino che mancano defvaro mancano require.
lunaryorn,

3
Mi dispiace ma a quali "riferimenti collegati" fai riferimento?
lunaryorn,

4
Quando decidi che "il compilatore è semplicemente sbagliato", il modo giusto per mettere a tacere questo avviso è dichiarare la variabile problematica con (defvar the-variable). Questo mette a tacere l'avvertimento solo per quella variabile, quindi puoi ancora ottenerlo per altre variabili.
Malabarba,

Risposte:


17

Per il beneficio dei lettori che non sanno arrivare, permettimi una piccola digressione per dire che questi avvisi in genere indicano problemi di codice reali (e quando non lo fanno, puoi eliminarli su una base per-variabile), quindi le persone dovrebbero ricercare ciò che significa prima di disabilitarli.

Certo, non ho dubbi sul fatto che tu sappia perché devi disabilitarlo, quindi la risposta è sotto.


La risposta

Per disabilitare questo (o altro) avviso, devi impostare il valore di byte-compile-warnings. Puoi farlo come variabile file-local aggiungendo il seguente frammento alla fine del file.

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

Puoi anche impostarlo a livello globale.

È possibile sostituire (not free-vars)con (not free-vars callargs unresolved)e con qualsiasi altro avviso che si desidera eliminare. L'elenco completo degli avvisi che possono essere inclusi / soppressi si trova nella documentazione della variabile (di seguito).

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.

Si noti che Flycheck non inoltra un'impostazione globale per questa variabile al sottoprocesso del compilatore di byte. Non sono nemmeno sicuro che valuti la variabile locale.
lunaryorn,

2
@lunaryorn Penso che la versione local-var dovrebbe funzionare con il flycheck. Almeno, il compilatore di byte di solito si occupa di leggere le variabili locali prima di compilare il file.
Malabarba,

5
@fommil Siamo spiacenti, non intendevo sembrare condiscendente. Ho scritto quel paragrafo perché altre persone potrebbero atterrare qui quando google questo avviso, e volevo che sapessero che è una cosa reale (non solo qualcosa che dovrebbero immediatamente disabilitare). Non si tratta di pulizia, ma di correttezza (il codice ha un significato diverso senza defvar). Dato che non hai menzionato il motivo per cui volevi disabilitarlo, ho pensato che valesse la pena ricordare che non dovrebbe essere la prima opzione.
Malabarba,

6
@fommil La tua domanda non include alcun riferimento a un caso d'uso più specifico. Si legge come un generale, domanda, e come tale, sottolineando che si tratta di solito (ma non necessariamente specificamente nel tuo caso) non è una buona idea per disabilitare tutte le avvertenze avrebbe dovuto far parte di qualsiasi risposta completa sugli avvisi invalidanti, non è vero ? Non sei l'unico a leggere questa risposta e non puoi aspettarti di ricevere una risposta specifica sulle tue esigenze specifiche se non le includi nella tua domanda.
lunaryorn,

1
@fommil Ho riformulato quel primo paragrafo per spero di leggere un po 'meglio. Fatemi sapere cosa ne pensate.
Malabarba,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.