En Emacs 25 y probablemente en algunas versiones anteriores, la forma más limpia de hacerlo es la siguiente:
Primero 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))))
Luego, si desea suprimir todos los mensajes producidos por some-functionusted, haga lo siguiente:
(advice-add 'some-function :around #'suppress-messages)
Por ejemplo, suprimo el mensaje "Proceso de Ispell eliminado" producido por la función ispell-kill-ispell(en ispell.el.gz) escribiendo:
(advice-add 'ispell-kill-ispell :around #'suppress-messages)
Si alguna vez necesita volver a habilitar los mensajes, ejecute:
(advice-remove 'some-function #'suppress-messages)
Algunas cosas a tener en cuenta:
1) Todos los mensajes producidos por some-functionserán suprimidos al igual que todos los mensajes producidos por cualquier función de lisp a la que llame la función.
2) Los mensajes producidos por el código C no se suprimirán, pero eso probablemente sea todo lo mejor.
3) Debe asegurarse de que -*- lexical-binding: t -*-esté contenido en la primera línea de su .elarchivo.
Pero, ¿cómo saber qué función llama message? Podrías revisar el código como alguien más sugirió, pero es más fácil dejar que Emacs haga el trabajo por ti.
Si define:
(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))))
y luego hacer:
(advice-add 'message :around #'who-called-me?)
obtendrá una traza inversa agregada al mensaje. A partir de esto, puede ver fácilmente dónde se generó el mensaje.
Puedes revertir esto con:
(advice-remove 'message #'who-called-me?)
Un enfoque alternativo sería aconsejar la messagefunción y la prueba para ver si desea imprimir el mensaje o no. Esto es simple si el mensaje en cuestión es una cadena fija. Por ejemplo, para suprimir el "proceso de Ispell eliminado", podría definir:
(defun suppress-ispell-message (old-fun format &rest args)
(if (string= format "Ispell process killed")
(ignore)
(apply old-fun format args)))
y luego hacer:
(advice-add 'message :around #'suppress-ispell-message)
Este enfoque pronto se vuelve muy complicado si el mensaje es algo complicado.