No Emacs 25 e provavelmente em algumas versões anteriores, a maneira mais limpa de fazer isso é a seguinte:
Primeiro defina:
(defun suppress-messages (old-fun &rest args)
(cl-flet ((silence (&rest args1) (ignore)))
(advice-add 'message :around #'silence)
(unwind-protect
(apply old-fun args)
(advice-remove 'message #'silence))))
Então, se você deseja suprimir todas as mensagens produzidas por some-function
você:
(advice-add 'some-function :around #'suppress-messages)
Por exemplo, suprimo a mensagem "Processo Ispell morto" produzido pela função ispell-kill-ispell
(in ispell.el.gz
) escrevendo:
(advice-add 'ispell-kill-ispell :around #'suppress-messages)
Se você precisar reativar as mensagens, execute:
(advice-remove 'some-function #'suppress-messages)
Algumas coisas a serem observadas:
1) Todas as mensagens produzidas por some-function
serão suprimidas, assim como todas as mensagens produzidas por qualquer função lisp que a função chamar.
2) As mensagens produzidas pelo código C não serão suprimidas, mas provavelmente é tudo o melhor.
3) Você precisa ter certeza de que -*- lexical-binding: t -*-
está contido na primeira linha do seu .el
arquivo.
Mas como você descobre qual função é chamada message
? Você pode verificar o código como alguém sugeriu, mas é mais fácil deixar o Emacs fazer o trabalho por você.
Se você definir:
(defun who-called-me? (old-fun format &rest args)
(let ((trace nil) (n 1) (frame nil))
(while (setf frame (backtrace-frame n))
(setf n (1+ n)
trace (cons (cadr frame) trace)) )
(apply old-fun (concat "<<%S>>\n" format) (cons trace args))))
e então faça:
(advice-add 'message :around #'who-called-me?)
você receberá um backtrace adicionado à mensagem. A partir disso, você pode ver facilmente onde a mensagem foi gerada.
Você pode reverter isso com:
(advice-remove 'message #'who-called-me?)
Uma abordagem alternativa seria aconselhar a message
função e testar se você deseja imprimir a mensagem ou não. Isso é simples se a mensagem em questão for uma sequência fixa. Por exemplo, para suprimir o "processo Ispell morto", você pode definir:
(defun suppress-ispell-message (old-fun format &rest args)
(if (string= format "Ispell process killed")
(ignore)
(apply old-fun format args)))
e então faça:
(advice-add 'message :around #'suppress-ispell-message)
Essa abordagem logo fica muito confusa se a mensagem for complicada.