In Emacs gibt es einige Fälle, in denen ich verhindern möchte, dass Nachrichten im Minipuffer angezeigt werden, hauptsächlich in Bezug auf "Anfang / Ende des Puffers" und "Text ist schreibgeschützt".
Kann ich auf irgendeine Weise verhindern, dass diese Meldungen im Minipuffer angezeigt werden?
Gibt es auch einen wichtigen Grund, warum ich diese möglicherweise nicht deaktivieren möchte? Beim Nennwert kann ich genauso gut die Zeilennummer und den Pufferschreibstatus auf der Modeline anzeigen.
Antworten:
In Emacs 25 können Sie Minibuffer-Meldungen unterdrücken, indem Sie
inhibit-message
an einen Wert ohne Null binden :quelle
message1
aufruftmessage3
, diese Variable berücksichtigen.(let ((inhibit-message t)) (message make-progress-reporter))
message
die Nachrichtenzeichenfolge zurückgegeben wird. Möglicherweise wird die zurückgegebene Zeichenfolge bei der Auswertung des Codes angezeigt. Wenn Sie diesen Code in einer Tastenkombination auswerten, wird keine Nachricht gedruckt (außer im Nachrichtenpuffer ).Sie können eine Art dieser Code von Lisp tun. Warum "irgendwie"? Da MESSAGE ein Primitiv ist, das in C anstelle einer Lisp-Funktion definiert ist und gemäß dem Emacs Lisp-Referenzhandbuch Aufrufe von Primitiven aus C-Code ignoriert.
Um die von Ihnen gewünschte Funktionalität wirklich zu implementieren, müssen Sie daher das MESSAGE-Grundelement als Lisp-Funktion neu definieren. Sobald Sie dies getan haben, können Sie es mit Code beraten, der die Zeichenfolge MESSAGE erhält, die an den Minipuffer zurückgemeldet wird, es mit einer Liste von Nachrichten vergleicht, die Sie nicht sehen möchten, und dann MESSAGE abhängig aufruft oder nicht aufruft auf das Ergebnis. Theoretisch könnte dies z. B.
(defvar *message-prim* (symbol-function 'message))
durch und dann erreicht werden(defun message (format &rest args) ... (funcall *message-prim* format args))
- aber SYMBOL-FUNCTION gibt bei einem primitiven Argument etwas zurück, das eigentlich nicht aufrufbar ist, sodass der FUNCALL eine VOID-FUNCTION-Bedingung signalisiert.Aber selbst wenn das funktioniert hätte, würde es den Trick nicht wirklich machen, da das Neudefinieren eines Primitivs nur garantiert, dass die Neudefinition verwendet wird, wenn die Funktion aus Lisp-Code aufgerufen wird. Aufrufe in C-Code können weiterhin die primitive Definition verwenden . (Es ist möglich, dass C-Code in Emacs Lisp aufgerufen wird, und in solchen Fällen wird die Neudefinition angezeigt. Natürlich kann C-Code auch C-Code aufrufen, und in solchen Fällen wird die ursprüngliche Definition angezeigt.)
Ich denke vage darüber nach, den C-Code zu patchen und Emacs neu zu kompilieren, um eine ordnungsgemäße Funktion zur Unterdrückung von Nachrichten bereitzustellen. Ich brauche diese Funktionalität nicht wirklich, aber sie könnte sich als interessante Übung erweisen, zumal ich kein C-Hacker bin. In der Zwischenzeit habe ich Folgendes hinzugefügt, das beim Ablegen in eine Datei, die aus einer Ihrer Init-Dateien stammt und auf Ihren Geschmack zugeschnitten ist, Meldungen aus dem Lisp-Code unterdrückt, die genau mit den Zeichenfolgen übereinstimmen, die Sie zur Unterdrückung auflisten. Solange die Unterdrückung aktiviert ist, werden diese Meldungen niemals im Minipuffer angezeigt. Sie haben die Möglichkeit, sie auch aus dem
*Messages*
Puffer zu unterdrücken .Ich habe dies getestet, um mit Nachrichten zu arbeiten, die tatsächlich aus Lisp-Code generiert wurden, z. B. der Beschwerde "Sie haben keine Funktion angegeben", die von DESCRIBE-FUNCTION wiederholt wird, wenn Sie ein leeres Zeichenfolgenargument angeben. Leider scheinen alle Nachrichten, die Sie unterdrücken möchten, wie "Beginn des Puffers", "Ende des Puffers" und "Text ist schreibgeschützt", vom C-Code zu stammen, was bedeutet, dass Sie dies nicht können unterdrücken sie durch diese Methode.
Wenn ich jemals zum Quell-Patch komme, wird es (wahrscheinlich) gegen Emacs 24.3 sein , und ich werde diese Antwort mit Informationen darüber aktualisieren, wie man damit umgeht.
quelle
In Emacs 25 und wahrscheinlich in früheren Versionen ist dies am saubersten wie folgt:
Zuerst definieren Sie:
Wenn Sie dann alle von
some-function
Ihnen erstellten Nachrichten unterdrücken möchten, gehen Sie wie folgt vor:Zum Beispiel unterdrücke ich die Nachricht "Ispell process killed", die von der Funktion
ispell-kill-ispell
(inispell.el.gz
) erzeugt wurde, indem ich schreibe:Wenn Sie die Nachrichten jemals wieder aktivieren müssen, führen Sie Folgendes aus:
Ein paar Dinge zu beachten:
1) Alle von erzeugten Nachrichten
some-function
werden unterdrückt, ebenso wie alle Nachrichten, die von einer von der Funktion aufgerufenen lisp-Funktion erzeugt werden.2) Mit C-Code erzeugte Nachrichten werden nicht unterdrückt, aber das ist wahrscheinlich das Beste.
3) Sie müssen sicherstellen, dass
-*- lexical-binding: t -*-
in der ersten Zeile Ihrer.el
Datei enthalten ist.Aber wie findet man heraus, welche Funktion aufgerufen wird
message
? Sie könnten den Code durchgehen, wie jemand anderes vorgeschlagen hat, aber es ist einfacher, Emacs die Arbeit für Sie erledigen zu lassen.Wenn Sie definieren:
und dann mache:
Sie erhalten eine Rückverfolgung zur Nachricht hinzugefügt. Daran können Sie leicht erkennen, wo die Nachricht generiert wurde.
Sie können dies umkehren mit:
Ein alternativer Ansatz wäre, die
message
Funktion zu beraten und zu testen, ob Sie die Nachricht drucken möchten oder nicht. Dies ist einfach, wenn die betreffende Nachricht eine feste Zeichenfolge ist. Um beispielsweise "Ispell-Prozess beendet" zu unterdrücken, können Sie Folgendes definieren:und dann mache:
Dieser Ansatz wird bald sehr unübersichtlich, wenn die Nachricht etwas Kompliziertes ist.
quelle
Sie fragen anscheinend nach einer Möglichkeit, bestimmte Nachrichten selektiv zu sperren . Die Antwort darauf ist, dass Sie den Code, der diese bestimmten Nachrichten ausgibt, neu definieren oder empfehlen müssen .
Um alle Meldungen, beispielsweise für die Dauer eines Codes, zu verhindern , können Sie mit
flet
odercl-flet
die Funktionmessage
lokal auf (Funktion) umdefinierenignore
. Oder die Technik in verwendet verwendenedt-electric-helpify
: Speichern Sie die ursprüngliche Definition vonmessage
,fset
zuignore
, re-fset
es wieder auf den ursprünglichen def (obwohl es besser ist , zu verwenden ,unwind-protect
wenn Sie das tun).quelle
grep
oderA
in Dired, um nach "diesen Fehlermeldungen" zu suchen . Suchen Sie nach dem Text der Fehlermeldung in den Emacs Lisp-Quelldateien (und möglicherweise auch in den Emacs C-Dateien, falls verfügbar). HTH.Dies funktioniert zum Unterdrücken von "Beginn des Puffers" und "Ende des Puffers" und erfordert keinen Emacs 25.
Inspiriert von https://lists.gnu.org/archive/html/help-gnu-emacs/2015-12/msg00189.html , verwendet jedoch "defadvice" für mehr Kompatibilität.
quelle