suppress warning: penugasan ke variabel bebas (dan lainnya)

14

Bagaimana saya bisa menekan peringatan "assignment to free variable" ketika byte mengkompilasi file emacs lisp?

Saya sebenarnya sebagian besar tertarik untuk menekannya untuk buffer tertentu ketika menggunakan flycheck, tapi saya mengerti ini hanya meneruskan ke byte compiler.

Akan lebih baik untuk mendapatkan daftar semua peringatan / kesalahan yang dapat ditekan.

UPDATE :
Demi kelengkapan, izinkan saya untuk mengklarifikasi bahwa ada banyak (bahasa agnostik) alasan untuk menonaktifkan peringatan kompiler. Beberapa contoh: untuk memudahkan transisi kode lawas ke kerangka kerja yang diperkuat serat, agar file awal dan resep dijalankan dalam konteks langsung, untuk menghilangkan kebisingan sambil memperbaiki masalah prioritas yang lebih tinggi, atau karena kompiler salah.

fommil
sumber
1
Jangan menekan peringatan ini, perbaiki. Mereka ada karena suatu alasan.
lunaryorn
2
@Lunaryorn no, mereka positif palsu.
Dari
1
Dengan segala hormat, dan tanpa melihat peringatan khusus, saya tidak akan setuju. Peringatan variabel bebas palsu sangat langka, dan jika memang terjadi dalam jumlah yang akan membuat Anda ingin membungkamnya, saya merasa sulit untuk percaya bahwa semuanya adalah positif palsu. Saya sangat curiga bahwa peringatan ini menunjukkan ada defvaratau tidak ada require.
lunaryorn
3
Maaf, "referensi terkait" apa yang Anda rujuk?
lunaryorn
4
Ketika Anda memutuskan bahwa "kompilator itu salah", cara yang tepat untuk membungkam peringatan ini adalah dengan mendeklarasikan variabel yang bermasalah (defvar the-variable). Ini membungkam peringatan hanya untuk variabel itu, sehingga Anda masih bisa mendapatkannya untuk variabel lain.
Malabarba

Jawaban:

17

Untuk kepentingan pembaca yang tidak mengerti yang tiba di sini, izinkan saya melakukan sedikit penyimpangan untuk mengatakan bahwa peringatan ini umumnya mengarah ke masalah kode nyata (dan ketika mereka tidak, Anda dapat menekan mereka berdasarkan basis per variabel) sehingga orang harus meneliti apa yang mereka maksud sebelum menonaktifkannya.

Tentu saja, saya tidak ragu bahwa Anda tahu mengapa Anda harus menonaktifkannya, jadi jawabannya ada di bawah ini.


Jawabannya

Untuk menonaktifkan peringatan ini (atau lainnya), Anda harus mengatur nilai byte-compile-warnings. Anda bisa melakukan ini sebagai variabel file-lokal dengan menambahkan potongan berikut di akhir file.

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

Anda juga dapat mengatur ini secara global.

Anda dapat mengganti (not free-vars)dengan (not free-vars callargs unresolved)dan peringatan apa pun yang ingin Anda tekan. Daftar lengkap peringatan yang dapat dimasukkan / ditekan ditemukan pada docstring variabel (di bawah).

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
sumber
Perhatikan bahwa Flycheck tidak meneruskan pengaturan global untuk variabel ini ke subproses kompiler byte. Saya bahkan tidak yakin apakah ini mengevaluasi variabel lokal.
lunaryorn
2
@Lunaryorn Saya pikir versi local-var harus bekerja dengan flycheck. Paling tidak, byte-compiler biasanya berhati-hati untuk membaca variabel lokal sebelum mengkompilasi file.
Malabarba
5
@filil Maaf, saya tidak bermaksud menggurui. Saya menulis paragraf itu karena orang lain mungkin mendarat di sini ketika mereka Google peringatan ini, dan saya ingin mereka tahu bahwa itu adalah hal yang nyata (bukan hanya sesuatu yang mereka harus segera nonaktifkan). Ini bukan tentang kebersihan, ini tentang kebenaran (kode memiliki arti berbeda tanpa defvar). Karena Anda tidak menyebutkan mengapa Anda ingin menonaktifkannya, saya pikir itu layak disebut bahwa itu tidak harus menjadi opsi pertama.
Malabarba
6
@fommil Pertanyaan Anda tidak menyertakan referensi apa pun untuk kasus penggunaan yang lebih spesifik. Itu berbunyi sebagai pertanyaan umum , dan dengan demikian, menunjukkan bahwa itu umumnya (tetapi tidak harus secara khusus dalam kasus Anda) bukan ide yang baik untuk menonaktifkan semua peringatan harus menjadi bagian dari jawaban lengkap tentang menonaktifkan peringatan, bukankah itu ? Anda bukan satu-satunya yang membaca jawaban ini dan Anda tidak dapat mengharapkan untuk diberikan jawaban spesifik tentang kebutuhan spesifik Anda jika Anda tidak memasukkan ini dalam pertanyaan Anda.
lunaryorn
1
@fommil Saya telah menulis ulang paragraf pertama agar mudah-mudahan membaca sedikit lebih baik. Biarkan aku tahu apa yang kamu pikirkan.
Malabarba