suprimir aviso: atribuição à variável livre (e outras)

14

Como posso suprimir o aviso "atribuição à variável livre" ao compilar um byte um arquivo emacs lisp?

Na verdade, estou principalmente interessado em suprimi-lo para um buffer específico ao usar o flycheck, mas entendo que isso está apenas passando para o compilador de bytes.

Também seria bom obter uma lista de todos os avisos / erros que podem ser suprimidos.

ATUALIZAÇÃO :
Para fins de completude, permita-me esclarecer que existem muitas razões (independentes do idioma) para desativar os avisos do compilador. Alguns exemplos: para facilitar a transição do código legado para uma estrutura imposta por fiapos, para que arquivos e receitas de rascunho sejam executados em um contexto ativo, para remover ruídos enquanto corrige problemas de prioridade mais alta ou porque o compilador está errado.

fommil
fonte
1
Não suprima esses avisos, corrija-os. Eles existem por uma razão.
lunaryorn
2
@unaryorn não, eles são falsos positivos.
fommil 13/01/16
1
Com todo o respeito, e sem ter visto os avisos específicos, eu discordaria. Os avisos de variáveis ​​livres falsas são muito escassos e, se ocorrerem em uma quantidade que faria você querer silenciá-los, acho difícil acreditar que todos eles sejam falsos positivos. Suspeito fortemente que esses avisos indiquem defvars faltando ou requires faltando .
lunaryorn
3
Sinto muito, mas a quais "referências vinculadas" você se refere?
lunaryorn
4
Quando você decide que "o compilador está errado", a maneira correta de silenciar esse aviso é declarar a variável problemática com (defvar the-variable). Isso silencia o aviso apenas para essa variável, para que você ainda possa obtê-lo para outras variáveis.
Malabarba 13/01

Respostas:

17

Para o benefício de leitores sem noção que chegam aqui, permita-me uma pequena digressão para dizer que esses avisos geralmente apontam para problemas reais de código (e quando não o fazem, você pode suprimi-los por variável) para que as pessoas pesquisem o que significa antes de desativá-los.

Obviamente, não tenho dúvidas de que você sabe por que precisa desativá-lo, então a resposta está abaixo.


A resposta

Para desativar este (ou outro) aviso, você precisará definir o valor de byte-compile-warnings. Você pode fazer isso como uma variável local do arquivo adicionando o seguinte fragmento ao final do arquivo.

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

Você também pode definir isso globalmente.

Você pode substituir (not free-vars)por (not free-vars callargs unresolved)outros avisos que desejar suprimir. A lista completa de avisos que podem ser incluídos / suprimidos é encontrada na documentação da variável (abaixo).

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
fonte
Observe que o Flycheck não encaminha uma configuração global para essa variável para o subprocesso do compilador de bytes. Eu nem tenho certeza se ele avalia a variável local.
lunaryorn
2
@ Lunaryorn Eu acho que a versão local-var deve funcionar com o flycheck. Pelo menos, o byte-compiler geralmente cuida da leitura de variáveis ​​locais antes de compilar o arquivo.
Malabarba 13/01
5
@omomil Desculpe, eu não quis parecer condescendente. Eu escrevi esse parágrafo porque outras pessoas podem chegar aqui quando pesquisam esse aviso no Google, e eu queria que elas soubessem que isso é real (não apenas algo que elas deveriam desativar imediatamente). Não se trata de limpeza, é de correção (o código tem um significado diferente sem o defvar). Como você não mencionou o motivo pelo qual deseja desativá-lo, achei que valia a pena mencionar que não deveria ser a primeira opção.
Malabarba 13/01
6
@fommil Sua pergunta não inclui nenhuma referência a um caso de uso mais específico. É uma pergunta geral e, como tal, indica que geralmente (mas não necessariamente especificamente no seu caso) não é uma boa ideia desabilitar todos os avisos. ? Você não é o único a ler esta resposta e não pode esperar receber uma resposta específica sobre suas necessidades específicas se não as incluir na sua pergunta.
lunaryorn
1
@fommil Eu reformulei o primeiro parágrafo para, espero, ler um pouco melhor. Diz-me o que pensas.
Malabarba 13/01