Emacs 25 ve muhtemelen bazı önceki sürümlerde, bunu yapmanın en temiz yolu aşağıdaki gibidir:
İlk önce şunları tanımlayın:
(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))))
Sonra, ürettiğiniz tüm mesajları bastırmak some-function
istiyorsanız:
(advice-add 'some-function :around #'suppress-messages)
Örneğin, işlev tarafından ispell-kill-ispell
(içinde ispell.el.gz
) üretilen "Ispell işlemi öldürüldü" mesajını yazarak bastırıyorum :
(advice-add 'ispell-kill-ispell :around #'suppress-messages)
Mesajları yeniden etkinleştirmeniz gerekiyorsa, çalıştırın:
(advice-remove 'some-function #'suppress-messages)
Unutulmaması gereken birkaç nokta:
1) tarafından üretilen tüm mesajlar some-function
Tarafından üretilen tüm mesajlar, herhangi bir lisp tarafından üretilen tüm mesajlar fonksiyonun çağırdığı gibi bastırılır.
2) C kodu tarafından üretilen iletiler bastırılmaz, ancak muhtemelen en iyisi budur.
3) Emin olun gerekir -*- lexical-binding: t -*-
ilk satırında bulunan.el
Dosyanızın .
Ama hangi fonksiyonun aradığını nasıl bulabilirsin? message
? Başka birinin önerdiği gibi kodu gözden geçirebilirsiniz, ancak Emacs'ın işi sizin için yapmasına izin vermek daha kolaydır.
Tanımlarsanız:
(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))))
ve sonra:
(advice-add 'message :around #'who-called-me?)
mesaja bir geri izleme eklenir. Buradan mesajın nerede oluşturulduğunu kolayca görebilirsiniz.
Bunu şununla tersine çevirebilirsiniz:
(advice-remove 'message #'who-called-me?)
Alternatif bir yaklaşım, message
fonksiyona tavsiyede bulunmak ve mesajı yazdırmak isteyip istemediğinizi test etmek olacaktır. Söz konusu mesaj sabit bir dize ise bu basittir. Örneğin, "Ispell süreci öldürüldü" yi bastırmak için şunları tanımlayabilirsiniz:
(defun suppress-ispell-message (old-fun format &rest args)
(if (string= format "Ispell process killed")
(ignore)
(apply old-fun format args)))
ve sonra:
(advice-add 'message :around #'suppress-ispell-message)
Mesaj karmaşık bir şeyse bu yaklaşım çok dağınık hale gelir.