У 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) Повідомлення, створені за допомогою коду С, не будуть придушені, але це, мабуть, все найкраще.
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)
Цей підхід незабаром стає дуже безладним, якщо повідомлення щось складне.