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