ngăn chặn cảnh báo: gán cho biến miễn phí (và những người khác)


14

Làm cách nào tôi có thể chặn cảnh báo "gán cho biến miễn phí" khi biên dịch byte tệp lac emacs?

Tôi thực sự quan tâm đến việc ngăn chặn nó cho một bộ đệm cụ thể khi sử dụng flycheck, nhưng tôi hiểu rằng đây chỉ là việc chuyển sang trình biên dịch byte.

Nó cũng sẽ là tốt để có được một danh sách tất cả các cảnh báo / lỗi có thể được loại bỏ.

CẬP NHẬT :
Để hoàn thiện, cho phép tôi làm rõ rằng có nhiều lý do (bất khả tri ngôn ngữ) để vô hiệu hóa các cảnh báo của trình biên dịch. Một số ví dụ: để dễ dàng chuyển đổi mã kế thừa sang khung được thi hành theo lint, để các tệp cào và công thức được chạy trong ngữ cảnh trực tiếp, để loại bỏ nhiễu trong khi sửa các vấn đề ưu tiên cao hơn hoặc do trình biên dịch bị lỗi.


1
Đừng kìm nén những cảnh báo này, hãy sửa chúng. Chúng tồn tại vì một lý do.
lunaryorn

2
@lunaryorn không, họ là dương tính giả.
fommil

1
Với tất cả sự tôn trọng, và không thấy những cảnh báo cụ thể, tôi sẽ không đồng ý. Các cảnh báo biến miễn phí sai rất khan hiếm và nếu điều đó xảy ra với số lượng khiến bạn muốn bịt miệng chúng, tôi thấy khó tin rằng tất cả chúng đều là dương tính giả. Tôi nghi ngờ rằng những cảnh báo này cho thấy thiếu defvars hoặc mất tích require.
lunaryorn

3
Tôi xin lỗi nhưng bạn tham khảo "liên kết" nào?
lunaryorn

4
Khi bạn quyết định rằng "trình biên dịch chỉ sai", cách đúng để làm im lặng cảnh báo này là khai báo biến có vấn đề với (defvar the-variable). Điều này làm im lặng cảnh báo chỉ cho biến đó, vì vậy bạn vẫn có thể nhận được cảnh báo cho các biến khác.
Malabarba

Câu trả lời:


17

Vì lợi ích của những người đọc không biết gì khi đến đây, hãy cho tôi một sự lạc quan nhỏ để nói rằng những cảnh báo này thường chỉ ra các vấn đề về mã thực (và khi họ không làm như vậy, bạn có thể loại bỏ chúng trên cơ sở từng biến) để mọi người nên nghiên cứu về chúng có nghĩa là trước khi vô hiệu hóa chúng.

Tất nhiên, tôi không có nghi ngờ rằng bạn biết tại sao bạn cần phải vô hiệu hóa nó, vì vậy câu trả lời là dưới đây.


Câu trả lời

Để tắt cảnh báo này (hoặc khác), bạn cần đặt giá trị của byte-compile-warnings. Bạn có thể làm điều này như một biến cục bộ tệp bằng cách thêm đoạn mã sau vào cuối tệp.

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

Bạn cũng có thể thiết lập điều này trên toàn cầu.

Bạn có thể thay thế (not free-vars)bằng (not free-vars callargs unresolved)và bất kỳ cảnh báo nào khác mà bạn muốn đàn áp. Danh sách đầy đủ các cảnh báo có thể được bao gồm / được nén được tìm thấy trên chuỗi doc của biến (bên dưới).

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.

Lưu ý rằng Flycheck không chuyển tiếp cài đặt chung cho biến này sang quy trình con của trình biên dịch byte. Tôi thậm chí không chắc liệu nó có đánh giá biến cục bộ hay không.
lunaryorn

2
@lunaryorn Tôi nghĩ phiên bản local-var nên hoạt động với flycheck. Ít nhất, trình biên dịch byte thường chú ý đọc các biến cục bộ trước khi biên dịch tệp.
Malabarba

5
@fommil Xin lỗi, tôi không có ý bảo trợ. Tôi đã viết đoạn đó bởi vì những người khác có thể hạ cánh ở đây khi họ google cảnh báo này và tôi muốn họ biết rằng đó là một điều có thật (không chỉ là thứ họ nên vô hiệu hóa ngay lập tức). Đó không phải là về sự sạch sẽ, mà là về tính chính xác (mã có một ý nghĩa khác mà không có defvar). Vì bạn không đề cập đến lý do tại sao bạn muốn vô hiệu hóa nó, tôi cho rằng điều đáng nói là nó không nên là lựa chọn đầu tiên.
Malabarba

6
@fommil Câu hỏi của bạn không bao gồm bất kỳ tài liệu tham khảo nào cho trường hợp sử dụng cụ thể hơn. Nó đọc như một câu hỏi chung , và như vậy, chỉ ra rằng nó nói chung (nhưng không nhất thiết phải cụ thể trong trường hợp của bạn) không phải là một ý tưởng tốt để vô hiệu hóa tất cả các cảnh báo sẽ là một phần của bất kỳ câu trả lời hoàn chỉnh nào về việc vô hiệu hóa các cảnh báo, sẽ không ? Bạn không phải là người duy nhất đọc câu trả lời này và bạn không thể mong đợi được trả lời cụ thể về nhu cầu cụ thể của mình nếu bạn không đưa những câu hỏi này vào câu hỏi của mình.
lunaryorn

1
@fommil Tôi đã điều chỉnh lại đoạn đầu tiên đó để hy vọng đọc tốt hơn một chút. Cho tôi biết bạn nghĩ gì.
Malabarba
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.