W Emacsie 25 i prawdopodobnie we wcześniejszych wersjach najczystszy sposób to zrobić:
Najpierw zdefiniuj:
(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))))
Następnie, jeśli chcesz ukryć wszystkie produkowane przez some-function
ciebie wiadomości :
(advice-add 'some-function :around #'suppress-messages)
Na przykład pomijam komunikat „Proces Ispell zabity” wywołany przez funkcję ispell-kill-ispell
(in ispell.el.gz
), pisząc:
(advice-add 'ispell-kill-ispell :around #'suppress-messages)
Jeśli kiedykolwiek będziesz musiał ponownie włączyć wiadomości, uruchom:
(advice-remove 'some-function #'suppress-messages)
Kilka rzeczy do zapamiętania:
1) Wszystkie komunikaty generowane przez some-function
będą pomijane, podobnie jak wszystkie komunikaty generowane przez dowolną funkcję lisp wywoływaną przez funkcję.
2) Wiadomości generowane przez kod C nie będą tłumione, ale to chyba wszystko, co najlepsze.
3) Musisz upewnić się, że -*- lexical-binding: t -*-
znajduje się w pierwszym wierszu .el
pliku.
Ale jak dowiedzieć się, która funkcja jest wywoływana message
? Możesz przeglądać kod, jak sugerował ktoś inny, ale łatwiej jest pozwolić Emacsowi wykonać pracę za Ciebie.
Jeśli zdefiniujesz:
(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))))
a następnie wykonaj:
(advice-add 'message :around #'who-called-me?)
otrzymasz wiadomość wsteczną dodaną do wiadomości. Dzięki temu możesz łatwo zobaczyć, gdzie wiadomość została wygenerowana.
Możesz to odwrócić za pomocą:
(advice-remove 'message #'who-called-me?)
Alternatywnym podejściem byłoby doradzenie message
funkcji i przetestowanie, czy chcesz wydrukować wiadomość, czy nie. Jest to proste, jeśli wiadomość jest stałym ciągiem. Np. Aby ukryć „proces Ispell zabity”, możesz zdefiniować:
(defun suppress-ispell-message (old-fun format &rest args)
(if (string= format "Ispell process killed")
(ignore)
(apply old-fun format args)))
a następnie wykonaj:
(advice-add 'message :around #'suppress-ispell-message)
Takie podejście wkrótce staje się bardzo nieuporządkowane, jeśli wiadomość jest czymś skomplikowanym.