Я очень зависим от *Messages*
буфера, но записи не помечены.
Как добавить временную метку к каждой записи в буфере сообщений Emacs ?
Так что как то так:
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]
станет примерно так:
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]
Я искал в EmacsWiki, Reddit и emacs.sx, конечно, безрезультатно.
Мне известно command-log-mode
, что это можно настроить для входа в систему с отметками времени, но это полезно только для интерактивных команд, а не для всех сообщений, включая «системные» в Emacs.
Вместо этого каждое сообщение, занесенное в буфер сообщений, должно иметь метку времени.
Как добавить временную метку к каждой записи в буфере сообщений Emacs , независимо от ее источника?
message
реализована на C и, вероятно, имеет прямых вызывающих, так что вы не сможете гарантировать, что каждое зарегистрированное сообщение получит временную метку без сборки Emacs самостоятельно. Тем не менее, вы можете посоветоватьmessage
команде ввести метку времени, когда она вызывается из Elisp. Требуется некоторая осторожность:message
может вызываться без аргументов, пустой строки формата и т. Д. Вы также хотите избежать рекурсивного цикла, если ваш совет по метке времени вызоветmessage
какой-либо путь к коду.after-change-functions
(в буфере сообщений), чтобы реализовать это. Когда что-то вставляется в конец буфера, ставьте перед ним метку времени.Ответы:
У меня есть следующий фрагмент в моем init.el, который был адаптирован из оригинала, который я нашел в следующей ветке Reddit: http://www.reddit.com/r/emacs/comments/16tzu9/anyone_know_of_a_reasonable_way_to_timestamp/
(РЕДАКТИРОВАТЬ: модернизировано для добавления-добавления и удаления неуклюжей обработки буфера только для чтения по рекомендации @blujay)
Это приводит к оформлению буфера * Messages * следующим образом:
источник
advice-add
? Сейчас это предпочтительный метод, поскольку он знает, как обрабатывать ситуации, которыеdefadvice
не могут. Кроме того, вы, вероятно, не должны делать(read-only-mode 0)
, потому что это, вероятно, навсегда. Вы можете привязатьinhibit-read-only
кt
всему коду , который модифицирует буфер.Вот простое решение @ xinfatang для нового
advice-add
синтаксиса в качестве обёртки вокругmessage
функции:Выходы
*Messages*
как:Добавить:
Удалять:
источник
(advice-add 'message :filter-args 'with-timestamp)
будет работать с такой функцией:(defun with-timestamp (args) (push (concat (format-time-string "[%F %T.%3N] ") (car args)) (cdr args)))
См. Https://www.emacswiki.org/emacs/DebugMessages :
Наконец, мне все еще нравится ответ Стюарта Хикинботтома , потому что он избегает показа метки времени в минибуфере, ниже приводится модифицированная версия, которую я использую, он игнорирует сообщения, отображаемые только в области эха (от
let
message-log-max
доnil
до вызова функции сообщения):источник
%F %T.%3N
на показ микросекунд