In Emacs 25 e probabilmente in alcune versioni precedenti, il modo più pulito per farlo è il seguente:
Per prima cosa definire:
(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))))
Quindi se vuoi sopprimere tutti i messaggi da some-function
te prodotti fai:
(advice-add 'some-function :around #'suppress-messages)
Ad esempio, sopprimo il messaggio "Processo Ispell ucciso" prodotto dalla funzione ispell-kill-ispell
(in ispell.el.gz
) scrivendo:
(advice-add 'ispell-kill-ispell :around #'suppress-messages)
Se hai mai bisogno di riattivare i messaggi, esegui:
(advice-remove 'some-function #'suppress-messages)
Alcune cose da notare:
1) Tutti i messaggi prodotti some-function
saranno soppressi così come tutti i messaggi prodotti da qualsiasi funzione lisp chiamata dalla funzione.
2) I messaggi prodotti dal codice C non verranno soppressi, ma probabilmente è tutto per il meglio.
3) È necessario assicurarsi che -*- lexical-binding: t -*-
sia contenuto nella prima riga del .el
file.
Ma come scopri quale funzione ha chiamato message
? Potresti consultare il codice come suggerito da qualcun altro, ma è più facile lasciare che Emacs faccia il lavoro per te.
Se si definisce:
(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 poi fai:
(advice-add 'message :around #'who-called-me?)
otterrai un backtrace aggiunto al messaggio. Da questo puoi vedere facilmente dove è stato generato il messaggio.
Puoi invertire questo con:
(advice-remove 'message #'who-called-me?)
Un approccio alternativo sarebbe quello di consigliare la message
funzione e provare per vedere se si desidera stampare il messaggio o meno. Questo è semplice se il messaggio in questione è una stringa fissa. Ad esempio per sopprimere "Processo Ispell ucciso" potresti definire:
(defun suppress-ispell-message (old-fun format &rest args)
(if (string= format "Ispell process killed")
(ignore)
(apply old-fun format args)))
e poi fai:
(advice-add 'message :around #'suppress-ispell-message)
Questo approccio diventa presto molto complicato se il messaggio è qualcosa di complicato.