Dans Emacs 25 et probablement dans certaines versions antérieures, la façon la plus simple de procéder est la suivante:
Définissez d'abord:
(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))))
Ensuite, si vous souhaitez supprimer tous les messages produits par some-function
vous, procédez comme suit:
(advice-add 'some-function :around #'suppress-messages)
Par exemple, je supprime le message "Processus Ispell tué" produit par la fonction ispell-kill-ispell
(in ispell.el.gz
) en écrivant:
(advice-add 'ispell-kill-ispell :around #'suppress-messages)
Si vous devez réactiver les messages, exécutez:
(advice-remove 'some-function #'suppress-messages)
Quelques points à noter:
1) Tous les messages produits par some-function
seront supprimés, tout comme tous les messages produits par toute fonction lisp appelée par la fonction.
2) Les messages produits par le code C ne seront pas supprimés mais c'est probablement tout pour le mieux.
3) Vous devez vous assurer qu'il -*- lexical-binding: t -*-
est contenu dans la première ligne de votre .el
fichier.
Mais comment savoir quelle fonction s'appelle message
? Vous pouvez parcourir le code comme quelqu'un d'autre l'a suggéré, mais il est plus facile de laisser Emacs faire le travail pour vous.
Si vous définissez:
(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))))
puis faites:
(advice-add 'message :around #'who-called-me?)
vous obtiendrez une trace ajoutée au message. De là, vous pouvez facilement voir où le message a été généré.
Vous pouvez inverser cela avec:
(advice-remove 'message #'who-called-me?)
Une autre approche serait de conseiller la message
fonction et de tester pour voir si vous souhaitez imprimer le message ou non. C'est simple si le message en question est une chaîne fixe. Par exemple, pour supprimer le "processus Ispell tué", vous pouvez définir:
(defun suppress-ispell-message (old-fun format &rest args)
(if (string= format "Ispell process killed")
(ignore)
(apply old-fun format args)))
puis faites:
(advice-add 'message :around #'suppress-ispell-message)
Cette approche devient rapidement très compliquée si le message est compliqué.