In Emacs 25 und wahrscheinlich in früheren Versionen ist dies am saubersten wie folgt:
Zuerst definieren Sie:
(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))))
Wenn Sie dann alle von some-function
Ihnen erstellten Nachrichten unterdrücken möchten, gehen Sie wie folgt vor:
(advice-add 'some-function :around #'suppress-messages)
Zum Beispiel unterdrücke ich die Nachricht "Ispell process killed", die von der Funktion ispell-kill-ispell
(in ispell.el.gz
) erzeugt wurde, indem ich schreibe:
(advice-add 'ispell-kill-ispell :around #'suppress-messages)
Wenn Sie die Nachrichten jemals wieder aktivieren müssen, führen Sie Folgendes aus:
(advice-remove 'some-function #'suppress-messages)
Ein paar Dinge zu beachten:
1) Alle von erzeugten Nachrichten some-function
werden unterdrückt, ebenso wie alle Nachrichten, die von einer von der Funktion aufgerufenen lisp-Funktion erzeugt werden.
2) Mit C-Code erzeugte Nachrichten werden nicht unterdrückt, aber das ist wahrscheinlich das Beste.
3) Sie müssen sicherstellen, dass -*- lexical-binding: t -*-
in der ersten Zeile Ihrer .el
Datei enthalten ist.
Aber wie findet man heraus, welche Funktion aufgerufen wird message
? Sie könnten den Code durchgehen, wie jemand anderes vorgeschlagen hat, aber es ist einfacher, Emacs die Arbeit für Sie erledigen zu lassen.
Wenn Sie definieren:
(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))))
und dann mache:
(advice-add 'message :around #'who-called-me?)
Sie erhalten eine Rückverfolgung zur Nachricht hinzugefügt. Daran können Sie leicht erkennen, wo die Nachricht generiert wurde.
Sie können dies umkehren mit:
(advice-remove 'message #'who-called-me?)
Ein alternativer Ansatz wäre, die message
Funktion zu beraten und zu testen, ob Sie die Nachricht drucken möchten oder nicht. Dies ist einfach, wenn die betreffende Nachricht eine feste Zeichenfolge ist. Um beispielsweise "Ispell-Prozess beendet" zu unterdrücken, können Sie Folgendes definieren:
(defun suppress-ispell-message (old-fun format &rest args)
(if (string= format "Ispell process killed")
(ignore)
(apply old-fun format args)))
und dann mache:
(advice-add 'message :around #'suppress-ispell-message)
Dieser Ansatz wird bald sehr unübersichtlich, wenn die Nachricht etwas Kompliziertes ist.