В Emacs 25 и, возможно, в некоторых более ранних версиях, самый чистый способ сделать это так:
Сначала определите:
(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))))
Затем, если вы хотите подавить все сообщения, созданные some-function
вами:
(advice-add 'some-function :around #'suppress-messages)
Например, я подавляю сообщение «процесс Ispell убит», созданный функцией ispell-kill-ispell
(in ispell.el.gz
), записав:
(advice-add 'ispell-kill-ispell :around #'suppress-messages)
Если вам когда-нибудь понадобится снова включить сообщения, запустите:
(advice-remove 'some-function #'suppress-messages)
Несколько вещей на заметку:
1) Все сообщения, генерируемые программой, some-function
будут подавлены, как и все сообщения, генерируемые любой функцией lisp, вызываемой функцией.
2) Сообщения, создаваемые кодом C, не будут подавлены, но это, вероятно, все к лучшему.
3) Вы должны убедиться, что -*- lexical-binding: t -*-
содержится в первой строке вашего .el
файла.
Но как вы узнаете, какая функция вызывается message
? Вы могли бы просмотреть код, как предлагал кто-то другой, но проще позволить Emacs сделать всю работу за вас.
Если вы определите:
(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))))
а затем сделать:
(advice-add 'message :around #'who-called-me?)
Вы получите добавленный к сообщению след. Отсюда вы можете легко увидеть, где было сгенерировано сообщение.
Вы можете изменить это с помощью:
(advice-remove 'message #'who-called-me?)
Альтернативным подходом было бы рекомендовать message
функцию и проверить, хотите ли вы напечатать сообщение или нет. Это просто, если рассматриваемое сообщение является фиксированной строкой. Например, чтобы подавить "процесс Ispell убит", вы можете определить:
(defun suppress-ispell-message (old-fun format &rest args)
(if (string= format "Ispell process killed")
(ignore)
(apply old-fun format args)))
а затем сделать:
(advice-add 'message :around #'suppress-ispell-message)
Этот подход скоро становится очень грязным, если сообщение является чем-то сложным.