경고 억제 : 자유 변수 (및 기타)에 할당


14

emacs lisp 파일을 바이트 컴파일 할 때 "변수를 할당 해제"경고를 표시하지 않으려면 어떻게해야합니까?

실제로 flycheck를 사용할 때 특정 버퍼에 대해 억제하는 데 관심이 있지만 바이트 컴파일러로 전달되는 것만 이해합니다.

억제 할 수있는 모든 경고 / 오류 목록을 얻는 것도 좋습니다.

업데이트 :
완전성을 기하기 위해 컴파일러 경고를 비활성화 해야하는 많은 (언어에 구애받지 않는) 이유가 있음을 분명히하겠습니다. 몇 가지 예 : 레거시 코드를 보푸라기가 적용된 프레임 워크로 쉽게 전환하고, 스크래치 파일 및 레시피를 라이브 컨텍스트 내에서 실행하거나, 우선 순위가 높은 문제를 해결하는 동안 노이즈를 제거하거나, 컴파일러가 잘못 되었기 때문에.


1
이 경고를 억제하지 말고 수정하십시오. 그들은 이유가 있습니다.
lunaryorn

2
@lunaryorn 아니오, 그들은 오 탐지입니다.
fommil

1
모든 것을 존중하고 구체적인 경고를 보지 않으면 동의하지 않을 것입니다. 틀린 자유 변수 경고는 매우 드물며,이를 원하지 않는 양으로 발생하면 모든 경고가 잘못된 것으로 생각하기가 어렵습니다. 이러한 경고가 누락 defvar또는 누락을 나타내는 것으로 의심 require됩니다.
lunaryorn

3
죄송하지만 "링크 된 참조"란 무엇입니까?
lunaryorn 2016 년

4
"컴파일러가 잘못되었습니다"라고 결정할 때이 경고를 끄는 올바른 방법은 문제가있는 변수를로 선언하는 것입니다 (defvar the-variable). 이렇게하면 해당 변수에 대해서만 경고가 표시되지 않으므로 다른 변수에 대해서는 계속 경고를받을 수 있습니다.
Malabarba

답변:


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 로컬 var 버전이 flycheck와 함께 작동해야한다고 생각합니다. 적어도 바이트 컴파일러는 일반적으로 파일을 컴파일하기 전에 로컬 변수를 읽도록주의를 기울입니다.
Malabarba

5
@fommil 죄송합니다. 후원하는 소리는 아닙니다. 다른 사람들이이 경고를 Google에 올릴 때 여기에 도달 할 수 있기 때문에이 단락을 썼습니다. 그것은 청결에 관한 것이 아니라 정확성에 관한 것입니다 (코드는 defvar가없는 다른 의미를 갖습니다). 비활성화하려는 이유에 대해 언급하지 않았으므로 첫 번째 옵션이 아니어야한다고 언급 할 가치가 있다고 생각했습니다.
Malabarba

6
@fommil 귀하의 질문에는 더 구체적인 사용 사례에 대한 언급이 포함되어 있지 않습니다. 그것은으로 읽고 일반적인 질문과 같은 지적하는 것은이 있다고 일반적으로 (그러나 반드시 구체적으로 귀하의 경우)을 비활성화 경고에 대한 완전한 해답의 일부가 될 것 모든 경고를 해제하지 않는 것이 좋습니다, 그것은 않을 것 ? 귀하는이 답변을 읽는 유일한 사람이 아니며 질문에 포함하지 않으면 귀하의 특정 요구에 대한 특정 답변을받을 것으로 기대할 수 없습니다.
lunaryorn

1
@fommil 나는 첫 번째 단락에서 희망적으로 조금 더 잘 읽을 것을 다시 말한 바 있습니다. 당신이 무슨 생각을하는지 제게 알려주세요.
Malabarba
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.