Bardzo zależę od *Messages*
bufora, ale wpisy nie są oznaczone datą.
Jak dodać znacznik czasu do każdego wpisu w buforze Wiadomości Emacsa ?
Więc coś takiego:
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]
stanie się mniej więcej tak:
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]
Przeszukałem oczywiście EmacsWiki, Reddit i emacs.sx, ale bezskutecznie.
Wiem o tym command-log-mode
, co można dostosować do rejestrowania za pomocą znaczników czasu, ale jest to przydatne tylko w przypadku interaktywnych poleceń, a nie wszystkich komunikatów, w tym również „systemowych” Emacsa.
Zamiast tego każda wiadomość zalogowana w buforze Wiadomości powinna być oznaczona znacznikiem czasu.
Jak dodać znacznik czasu do każdego wpisu w buforze Wiadomości Emacsa , bez względu na jego źródło?
message
Komenda jest zaimplementowana w C i prawdopodobnie ma bezpośrednie rozmówców, więc nie będzie w stanie zapewnić każda zalogowana wiadomość dostaje znacznik czasu bez budowania Emacs samodzielnie. To powiedziawszy, możesz być w stanie doradzićmessage
poleceniu wprowadzenia znacznika czasu, gdy jest wywoływany z Elisp. Wymagana jest pewna ostrożność:message
można ją wywoływać bez argumentów, pustych ciągów formatu itp. Aby uniknąć pętli rekurencyjnej, należy również wywoływać porady dotyczące znaczników czasumessage
na ścieżce kodu.after-change-functions
(w buforze komunikatów) do wdrożenia tego. Ilekroć coś jest wstawiane na końcu bufora, poprzedź przed nim znacznik czasu.Odpowiedzi:
W moim pliku init.el mam następujący fragment kodu, który został zaadaptowany z oryginału znalezionego w następującym wątku Reddit: http://www.reddit.com/r/emacs/comments/16tzu9/anyone_know_of_a_reasonable_way_to_timestamp/
(EDYCJA: zmodernizowano w celu dodawania porad i usunięto niezdarną obsługę buforów tylko do odczytu zgodnie z zaleceniami @blujay)
Powoduje to dekorację bufora * Messages * w następujący sposób:
źródło
advice-add
? Jest to obecnie preferowana metoda, ponieważ wie, jak radzić sobie w sytuacjach, któredefadvice
nie są w stanie. Ponadto prawdopodobnie nie powinieneś tego robić(read-only-mode 0)
, ponieważ prawdopodobnie jest to trwałe. Można powiązaćinhibit-read-only
dot
całego kodu, który modyfikuje buforowego.Tłumaczenie prostego rozwiązania @ xinfatang na nową
advice-add
składnię jako otokimessage
funkcji:Wyjścia
*Messages*
takie jak:Dodać:
Usuwać:
źródło
(advice-add 'message :filter-args 'with-timestamp)
działałby z taką funkcją:(defun with-timestamp (args) (push (concat (format-time-string "[%F %T.%3N] ") (car args)) (cdr args)))
Patrz https://www.emacswiki.org/emacs/DebugMessages :
Wreszcie ja wciąż jak Stuart Hickinbottom odpowiedź „s, ponieważ uniknąć Pokaż czas w minibufora dodaje to zmodyfikowana wersja którego używam, to zignorować komunikaty wyświetlane tylko w obszarze echa (przez
let
message-log-max
sięnil
przed wywołaniem funkcji wiadomości):źródło
%F %T.%3N
na mikrosekundy pokazu