警告の抑制:自由変数(およびその他)への割り当て


14

emacs lispファイルをバイトコンパイルする際に、「自由変数への割り当て」警告を抑制するにはどうすればよいですか?

私は実際に、flycheckを使用するときに特定のバッファーでそれを抑制することに主に興味を持っていますが、これはバイトコンパイラに渡されることを理解しています。

また、抑制できるすべての警告/エラーのリストを取得することもできます。

更新
完全を期すために、コンパイラの警告を無効にする理由は(言語に依存しない)多くの理由があることを明確にさせてください。いくつかの例:レガシーコードのリント適用フレームワークへの移行を容易にするため、スクラッチファイルおよびレシピをライブコンテキスト内で実行するため、優先度の高い問題を修正しながらノイズを除去するため、またはコンパイラーが間違っているため。


1
これらの警告を抑制しないで、修正してください。それらには理由があります。
lunaryorn

2
@lunaryornいいえ、それらは誤検知です。
-fommil

1
すべての敬意を払って、特定の警告を見たことなく、私は同意しません。偽の自由変数の警告は非常に少なく、それらを沈黙させたい量が発生する場合、それらすべてが偽陽性であると信じることは難しいと思います。これらの警告は、欠落しているdefvarまたは欠落していることを示していると強く思いますrequire
lunaryorn

3
申し訳ありませんが、「リンクされた参照」とは何ですか?
lunaryorn

4
「コンパイラが間違っている」と判断した場合、この警告を黙らせる正しい方法は、問題のある変数をで宣言することです(defvar the-variable)。これにより、その変数についてのみ警告が消音されるため、他の変数についても警告を取得できます。
マラバルバ

回答:


17

ここに到着した無知な読者の利益のために、これらの警告は一般的に実際のコードの問題を指していると言う小さな余談を許可します(そうでない場合は、変数ごとにそれらを抑制することができます)それらを無効にする前に意味します。

もちろん、それを無効にする必要がある理由を知っていることは間違いないので、答えは以下のとおりです。


答え

この(または他の)警告を無効にするには、の値を設定する必要がありますbyte-compile-warnings。ファイルの最後に次のスニペットを追加することにより、ファイルローカル変数としてこれを行うことができます。

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

これをグローバルに設定することもできます。

あなたは置き換えることができ(not free-vars)(not free-vars callargs unresolved)、あなたは抑制したい方の他の警告。含める/抑制することができる警告の完全なリストは、変数のdocstring(下記)にあります。

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.

Flycheckは、この変数のグローバル設定をバイトコンパイラサブプロセスに転送しないことに注意してください。ローカル変数を評価するかどうかもわかりません。
lunaryorn

2
@lunaryorn local-varバージョンはflycheckで動作するはずです。少なくとも、バイトコンパイラは通常、ファイルをコンパイルする前にローカル変数を読み取るように注意します。
マラバルバ

5
@fommil申し訳ありませんが、ひいきにするつもりはありませんでした。この警告をグーグルで検索したときに他の人がここに着く可能性があるため、私はその段落を書きました。私は彼らにそれが本物であることを知ってほしかったです。クリーンさではなく、正確さについてです(defvarなしではコードの意味は異なります)。なぜそれを無効にしたいのかについて言及しなかったので、私はそれが最初のオプションであってはならないことに言及する価値があると考えました。
マラバルバ

6
@fommilあなたの質問には、より具体的なユースケースへの言及は含まれていません。それは一般的な質問として読みますので、一般的に(しかし必ずしもあなたの場合は必ずしも具体的ではありません)すべての警告を無効にすることは警告を無効にすることに関する完全な回答の一部である必要はないことを指摘します?この回答を読んでいるのはあなただけではありません。質問にこれらを含めない場合、特定のニーズについて特定の回答を受け取ることは期待できません。
lunaryorn

1
@fommil願わくばもう少し読みやすくなるように、最初の段落を書き直しました。どう考えているか教えてください。
マラバルバ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.