Dans Emacs, il y a des cas où j'aimerais empêcher les messages d'apparaître dans le mini-tampon, concernant principalement "Début / Fin du tampon" et "Le texte est en lecture seule".
Existe-t-il un moyen d'empêcher ces messages d'apparaître dans le mini-tampon?
De plus, y a-t-il une raison importante pour laquelle je ne voudrais pas les désactiver? À première vue, je peux tout aussi facilement regarder le numéro de ligne et l'état d'écriture du tampon sur la modélisation.
Réponses:
Dans Emacs 25, vous pouvez supprimer les messages du mini-tampon en établissant une liaison
inhibit-message
avec une valeur non nulle:la source
message1
appellemessage3
, respecter cette variable.(let ((inhibit-message t)) (message make-progress-reporter))
message
renvoie la chaîne de message, donc peut-être que vous voyez la chaîne renvoyée lors de l'évaluation du code. Si vous évaluez ce code dans une liaison de touches, aucun message ne sera imprimé (sauf dans le tampon Messages ).Vous pouvez en quelque sorte le faire à partir du code Lisp. Pourquoi "en quelque sorte"? Parce que MESSAGE est une primitive, définie en C, au lieu d'une fonction Lisp, et, selon le manuel de référence Emacs Lisp , les appels aux primitives du code C ignorent les conseils.
Par conséquent, afin de vraiment faire un bon travail d'implémentation de la fonctionnalité que vous désirez, vous devrez redéfinir la primitive MESSAGE en tant que fonction Lisp; une fois que vous l'avez fait, vous pouvez ensuite le conseiller avec du code qui obtient la chaîne que MESSAGE ferait écho au mini-tampon, le compare avec une liste de messages que vous ne voulez pas voir, puis appelle ou n'appelle pas MESSAGE selon sur le résultat. En théorie, cela pourrait être accompli par exemple
(defvar *message-prim* (symbol-function 'message))
, puis(defun message (format &rest args) ... (funcall *message-prim* format args))
- mais SYMBOL-FUNCTION avec un argument primitif renvoie quelque chose qui n'est pas réellement appelable, donc FUNCALL signale une condition VOID-FUNCTION.Cependant, même si cela fonctionnait, cela ne ferait toujours pas vraiment l'affaire, car la redéfinition d'une primitive garantit uniquement que la redéfinition sera utilisée lorsque la fonction sera appelée à partir du code Lisp; les appels en code C peuvent toujours utiliser la définition primitive . (Il est possible que le code C appelle dans Emacs Lisp, et de tels cas verront la redéfinition; il est également possible, bien sûr, que le code C appelle le code C, et ces cas verront la définition d'origine.)
J'envisage vaguement de patcher le code C et de recompiler Emacs pour fournir une fonctionnalité de suppression des messages appropriée; Je n'ai pas vraiment besoin de cette fonctionnalité, mais cela pourrait s'avérer un exercice intéressant, d'autant plus que je ne suis pas un hacker C. En attendant, voici quelque chose que j'ai concocté qui, lorsqu'il est déposé dans un fichier, inclus dans l'un de vos fichiers init et personnalisé à votre goût, supprimera les messages provenant du code Lisp qui correspondent exactement aux chaînes que vous répertoriez pour la suppression. Tant que la suppression est activée, ces messages n'apparaîtront jamais dans le mini-tampon; vous avez la possibilité de les supprimer également du
*Messages*
tampon.J'ai testé cela pour travailler avec des messages qui sont réellement générés à partir du code Lisp, par exemple la plainte "Vous n'avez pas spécifié de fonction" renvoyée par DESCRIBE-FUNCTION lorsque vous lui donnez un argument de chaîne vide. Malheureusement, les messages que vous mentionnez vouloir supprimer, tels que "Début du tampon", "Fin du tampon" et "Le texte est en lecture seule", semblent tous provenir du code C, ce qui signifie que vous ne pourrez pas les supprimer par cette méthode.
Si jamais je passe au patch source, ce sera (probablement) contre Emacs 24.3 , et je mettrai à jour cette réponse avec des informations sur la façon de l'utiliser.
la source
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:
Ensuite, si vous souhaitez supprimer tous les messages produits par
some-function
vous, procédez comme suit:Par exemple, je supprime le message "Processus Ispell tué" produit par la fonction
ispell-kill-ispell
(inispell.el.gz
) en écrivant:Si vous devez réactiver les messages, exécutez:
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:
puis faites:
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:
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:puis faites:
Cette approche devient rapidement très compliquée si le message est compliqué.
la source
Vous demandez apparemment un moyen d' inhiber sélectivement certains messages. La réponse à cela est que vous devrez redéfinir ou conseiller le code qui émet ces messages particuliers .
Pour empêcher tous les messages, par exemple pendant la durée d'un code, vous pouvez utiliser
flet
oucl-flet
pour redéfinir la fonctionmessage
localement en (fonction)ignore
. Ou utilisez la technique utilisée dansedt-electric-helpify
: enregistrez la définition d'origine demessage
,fset
pourignore
,fset
revenir à la définition d' origine (bien qu'il soit préférable de l'utiliserunwind-protect
si vous le faites).la source
grep
ouA
dans Dired. Recherchez le texte du message d'erreur dans les fichiers source Emacs Lisp (et peut-être aussi dans les fichiers Emacs C, si vous les avez disponibles). HTH.Cela fonctionne pour supprimer "Début du tampon" et "Fin du tampon" et ne nécessite pas emacs 25.
Inspiré par https://lists.gnu.org/archive/html/help-gnu-emacs/2015-12/msg00189.html mais utilise "defadvice" pour plus de compatibilité.
la source