ukryj ostrzeżenie: przypisanie do zmiennej swobodnej (i innych)

14

Jak mogę ukryć ostrzeżenie „przypisanie do wolnej zmiennej”, gdy bajt kompiluje plik Lisp Emacsa?

Właściwie najbardziej interesuje mnie pomijanie go dla określonego bufora podczas korzystania z Flycheck, ale rozumiem, że to tylko przekazanie do kompilatora bajtów.

Dobrze byłoby również uzyskać listę wszystkich ostrzeżeń / błędów, które można pominąć.

AKTUALIZACJA :
Ze względu na kompletność, pozwól mi wyjaśnić, że istnieje wiele (niezależnych od języka) powodów, aby wyłączyć ostrzeżenia kompilatora. Kilka przykładów: ułatwienie przejścia starszego kodu do szkieletu wymuszonego przez strzępki, aby pliki scratch i przepisy były uruchamiane w kontekście na żywo, aby usunąć szum przy naprawianiu problemów o wyższym priorytecie lub ponieważ kompilator jest po prostu zły.

Fommil
źródło
1
Nie pomijaj tych ostrzeżeń, napraw je. Istnieją z jakiegoś powodu.
lunaryorn
2
@lunaryorn nie, są fałszywie pozytywne.
fommil
1
Z całym szacunkiem i bez obejrzenia konkretnych ostrzeżeń nie zgodziłbym się. Fałszywe ostrzeżenia o zmiennej zmiennej są bardzo rzadkie, a jeśli zdarzają się w takiej ilości, że chciałbyś je uciszyć, trudno mi uwierzyć, że wszystkie są fałszywie pozytywne. Podejrzewam, że te ostrzeżenia wskazują na brakujące defvars lub brakujące requires.
lunaryorn
3
Przykro mi, ale do jakich „odnośników powiązanych” odwołujesz się?
lunaryorn
4
Gdy zdecydujesz, że „kompilator jest po prostu zły”, właściwym sposobem wyciszenia tego ostrzeżenia jest zadeklarowanie problematycznej zmiennej (defvar the-variable). To wycisza ostrzeżenie tylko dla tej zmiennej, więc nadal można ją uzyskać dla innych zmiennych.
Malabarba

Odpowiedzi:

17

Z korzyścią dla przybywających tutaj nieświadomych czytelników, pozwólcie mi na małą dygresję, aby powiedzieć, że te ostrzeżenia zazwyczaj wskazują na rzeczywiste problemy z kodem (a jeśli nie, możesz je pomijać dla poszczególnych zmiennych), aby ludzie mogli zbadać, co mają znaczy przed wyłączeniem ich.

Oczywiście nie mam wątpliwości, że wiesz, dlaczego musisz to wyłączyć, więc odpowiedź jest poniżej.


Odpowiedź

Aby wyłączyć to (lub inne) ostrzeżenie, musisz ustawić wartość byte-compile-warnings. Możesz to zrobić jako zmienną lokalną dla pliku, dodając następujący fragment kodu na końcu pliku.

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

Możesz to również ustawić globalnie.

Można wymienić (not free-vars)ze (not free-vars callargs unresolved)i inne w zależności od tego ostrzeżenia chcesz stłumić. Pełna lista ostrzeżeń, które można włączyć / wyłączyć, znajduje się w dokumentacji zmiennej (poniżej).

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
źródło
Zauważ, że Flycheck nie przekazuje globalnego ustawienia tej zmiennej do podprocesu kompilatora bajtów. Nie jestem nawet pewien, czy ocenia zmienną lokalną.
lunaryorn
2
@lunaryorn Myślę, że wersja local-var powinna współpracować z Flycheck. Przynajmniej kompilator bajtów zazwyczaj dba o odczyt zmiennych lokalnych przed skompilowaniem pliku.
Malabarba
5
@fommil Przepraszamy, nie chciałem brzmieć protekcjonalnie. Napisałem ten akapit, ponieważ inni ludzie mogą tu wylądować, gdy wyszukują w Google to ostrzeżenie, i chciałem, aby wiedzieli, że to prawdziwa rzecz (nie tylko coś, co powinni natychmiast wyłączyć). Nie chodzi o czystość, chodzi o poprawność (kod ma inne znaczenie bez defvar). Ponieważ nie wspomniałeś, dlaczego chcesz go wyłączyć, pomyślałem, że warto wspomnieć, że nie powinna to być pierwsza opcja.
Malabarba
6
@fommil Twoje pytanie nie zawiera żadnych odniesień do bardziej konkretnego przypadku użycia. To brzmi jak ogólne pytanie, i jako takie, wskazując, że jest to zazwyczaj (ale niekoniecznie specjalnie w danym przypadku) nie jest dobrym pomysłem, aby wyłączyć wszystkie ostrzeżenia musiałaby być częścią każdej pełnej odpowiedzi na temat ostrzeżeń inwalidztwo, prawda ? Nie jesteś jedynym, który czyta tę odpowiedź i nie możesz oczekiwać, że otrzymasz konkretną odpowiedź na temat twoich konkretnych potrzeb, jeśli nie uwzględnisz ich w swoim pytaniu.
lunaryorn
1
@fommil Przeredagowałem ten pierwszy akapit, aby mam nadzieję, że przeczytam trochę lepiej. Powiedz mi co myślisz.
Malabarba