Ich bin sehr vom *Messages*
Puffer abhängig , aber die Einträge sind nicht mit einem Zeitstempel versehen.
Wie kann man jedem Eintrag im Nachrichtenpuffer von Emacs einen Zeitstempel hinzufügen ?
So dass so etwas:
Loading /Users/gsl/lisp.d/init.el (source)...
No outline structure detected
For information about GNU Emacs and the GNU system, type C-h C-a.
Loading /Users/gsl/lisp.d/var/recentf...done
Error running timer: (wrong-number-of-arguments (lambda nil (setq gc-cons-threshold (* 64 1024 1024)) (message "WARNING: gc-cons-threshold restored to %S")) 1)
[yas] Prepared just-in-time loading of snippets successfully.
M-] is undefined
CHILDREN [2 times]
‘show-all’ is an obsolete command (as of 25.1); use ‘outline-show-all’ instead.
Invalid face reference: nil [33 times]
Auto-saving...done
Saving file /Users/gsl/lisp.d/init.el...
Wrote /Users/gsl/lisp.d/init.el
mwheel-scroll: Beginning of buffer [5 times]
Mark set
previous-line: Beginning of buffer [10 times]
Quit [4 times]
wird so etwas werden:
2017-02-14-18:50:01 Loading /Users/gsl/lisp.d/init.el (source)...
2017-02-14-18:50:02 No outline structure detected
2017-02-14-18:50:03 For information about GNU Emacs and the GNU system, type C-h C-a.
2017-02-14-18:50:05 Loading /Users/gsl/lisp.d/var/recentf...done
2017-02-14-18:50:10 Error running timer: (wrong-number-of-arguments (lambda nil (setq gc-cons-threshold (* 64 1024 1024)) (message "WARNING: gc-cons-threshold restored to %S")) 1)
2017-02-14-18:50:12 [yas] Prepared just-in-time loading of snippets successfully.
2017-02-14-18:50:40 M-] is undefined
2017-02-14-18:50:41 CHILDREN [2 times]
2017-02-14-18:50:00 ‘show-all’ is an obsolete command (as of 25.1); use ‘outline-show-all’ instead.
2017-02-14-18:50:01 Invalid face reference: nil [33 times]
2017-02-14-18:51:01 Auto-saving...done
2017-02-14-18:51:03 Saving file /Users/gsl/lisp.d/init.el...
2017-02-14-18:51:06 Wrote /Users/gsl/lisp.d/init.el
2017-02-14-18:51:09 mwheel-scroll: Beginning of buffer [5 times]
2017-02-14-18:51:11 Mark set
2017-02-14-18:51:21 previous-line: Beginning of buffer [10 times]
Ich habe natürlich vergeblich nach EmacsWiki, Reddit und emacs.sx gesucht.
Mir ist bekannt command-log-mode
, dass dies so angepasst werden kann, dass es mit Zeitstempeln protokolliert, aber es ist nur für interaktive Befehle nützlich, nicht für alle Nachrichten, einschließlich der "System" -Nachrichten von Emacs.
Stattdessen sollte jede im Nachrichtenpuffer protokollierte Nachricht mit einem Zeitstempel versehen werden.
Wie kann man jedem Eintrag im Nachrichtenpuffer von Emacs einen Zeitstempel hinzufügen , unabhängig von seiner Quelle?
message
Befehl ist in C implementiert und hat wahrscheinlich direkte Anrufer, sodass Sie nicht sicherstellen können, dass jede protokollierte Nachricht einen Zeitstempel erhält, ohne Emacs selbst zu erstellen. Sie können demmessage
Befehl jedoch möglicherweise raten , einen Zeitstempel einzuführen, wenn er von Elisp aufgerufen wird. Einige Vorsicht ist geboten:message
Kann ohne Argumente, eine leere Formatzeichenfolge usw. aufgerufen werden. Sie möchten auch eine rekursive Schleife vermeiden, falls Ihr Zeitstempel-Hinweis selbstmessage
einen Codepfad aufruft.after-change-functions
(im Nachrichtenpuffer) verwenden, um dies zu implementieren. Wenn am Ende des Puffers etwas eingefügt wird, stellen Sie ihm einen Zeitstempel voran.Antworten:
Ich habe das folgende Snippet in meiner init.el, das von einem Original übernommen wurde, das ich im folgenden Reddit-Thread gefunden habe: http://www.reddit.com/r/emacs/comments/16tzu9/anyone_know_of_a_reasonable_way_to_timestamp/
(BEARBEITEN: Modernisiert, um ungeschickte schreibgeschützte Pufferhandhabung auf Empfehlung von @blujay hinzuzufügen und zu entfernen)
Dies führt zu einer Dekoration des * Nachrichten * -Puffers wie folgt:
quelle
advice-add
? Es ist jetzt die bevorzugte Methode, da es weiß, wie man mit Situationen umgeht,defadvice
die nicht möglich sind. Auch sollten Sie wahrscheinlich nicht tun(read-only-mode 0)
, weil das wahrscheinlich dauerhaft ist. Sie können an den Code bindeninhibit-read-only
,t
der den Puffer ändert.Die Übersetzung von @ xinfatangs einfacher Lösung in die neue
advice-add
Syntax als Wrapper um diemessage
Funktion lautet:Ausgaben
*Messages*
wie:Hinzufügen:
Zu entfernen:
quelle
(advice-add 'message :filter-args 'with-timestamp)
würde mit einer Funktion wie dieser funktionieren:(defun with-timestamp (args) (push (concat (format-time-string "[%F %T.%3N] ") (car args)) (cdr args)))
Siehe unter https://www.emacswiki.org/emacs/DebugMessages :
Schließlich mag ich immer noch die Antwort von Stuart Hickinbottom , weil sie das Anzeigen des Zeitstempels im Minibuffer vermeidet. Die folgende Version wurde modifiziert. Ich ignoriere Nachrichten, die nur im Echobereich angezeigt werden (
let
message-log-max
bisnil
vor dem Aufruf der Nachrichtenfunktion):quelle
%F %T.%3N
für Mikrosekunden