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-function
usted, 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-function
será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 .el
archivo.
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 message
funció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.