Emacsの* Messages *バッファーの各エントリにタイムスタンプを追加する方法は?


11

私は*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のメッセージバッファの各エントリにタイムスタンプを追加するにはどうすればよいですか?


2
これはEmacsの機能リクエストのようです。messageコマンドはCで実装され、あなたは、すべてログに記録されたメッセージは、Emacsの自分自身を構築することなく、タイムスタンプを取得することを確認することができなくなりますので、おそらく、直接の呼び出し元を持っています。つまりmessage、Elispから呼び出されたときにコマンドにタイムスタンプを導入するように指示できる場合があります。いくつかの注意が必要です。message引数なし、空のフォーマット文字列などで呼び出すmessageことができます。タイムスタンプアドバイス自体がコードパスで呼び出された場合の再帰的なループも避けたいです。
グルカ2017

1
私はそれを試していませんが、あなたがメッセージにアドバイスすることができるはずのように思える emacswiki.org/emacs/AdvisingFunctions stackoverflow.com/questions/21524488/... superuser.com/questions/669701/...
eflanigan00

1
それafter-change-functionsを実装するために(メッセージバッファーで)を使用する傾向があります。何かがバッファの最後に挿入されるときはいつでも、それにタイムスタンプを付けます。
phils 2017年

1
@philsから参照してくださいgnu.org/software/emacs/manual/html_node/elisp/Change-Hooks.htmlの へのメッセージの出力メッセージこれらの関数を呼び出して、どちらもそのように作成バッファの変更などの特定の内部バッファの変更を、行いませんバッファEmacsによって特定の仕事のために内部的に、それはLispプログラムには見えないはずです。
xinfa tang 2018

回答:


7

私のinit.elに次のスニペットがあります。これは、次のRedditスレッドで見つけたオリジナルから適応されたものです。http//www.reddit.com/r/emacs/comments/16tzu9/anyone_know_of_a_reasonable_way_to_timestamp/

(編集:@blujayのアドバイスに対するアドバイスの追加と削除、不器用な読み取り専用バッファーの処理への近代化)

(defun sh/current-time-microseconds ()
  "Return the current time formatted to include microseconds."
  (let* ((nowtime (current-time))
         (now-ms (nth 2 nowtime)))
    (concat (format-time-string "[%Y-%m-%dT%T" nowtime) (format ".%d]" now-ms))))

(defun sh/ad-timestamp-message (FORMAT-STRING &rest args)
  "Advice to run before `message' that prepends a timestamp to each message.

Activate this advice with:
(advice-add 'message :before 'sh/ad-timestamp-message)"
  (unless (string-equal FORMAT-STRING "%s%s")
    (let ((deactivate-mark nil)
          (inhibit-read-only t))
      (with-current-buffer "*Messages*"
        (goto-char (point-max))
        (if (not (bolp))
          (newline))
        (insert (sh/current-time-microseconds) " ")))))

(advice-add 'message :before 'sh/ad-timestamp-message)

これにより、次のように* Messages *バッファが装飾されます。

[2017-06-13T07:21:13.270070] Turning on magit-auto-revert-mode...
[2017-06-13T07:21:13.467317] Turning on magit-auto-revert-mode...done
[2017-06-13T07:21:13.557918] For information about GNU Emacs and the GNU system, type C-h C-a.

3
これがデフォルトでオプションとして提供されていないのはなぜですか。
bertfred 2017年

1
素晴らしい、これはまさに私が探していたものです。ありがとうございました。
gsl 2017年

2
@bertfred誰もそれを起こしていないので。たぶん、それはあなたですか?
Phil Lord

2
を使用してアドバイスを書き直していただけadvice-addませんか?これは、今ではdefadviceできない方法を処理する方法を知っているため、推奨される方法です。また、(read-only-mode 0)それはおそらく永続的であるため、おそらく行うべきではありません。あなたはバインドできるinhibit-read-onlyまでtバッファを変更するコードの周り。
ブルジェイ2017

2
私はあなたのコードを使用しますが、タイムスタンプだけで多くのメッセージを表示します
xinfa tang

5

関数のadvice-addラッパーとしての新しい構文に対する@xinfatangの簡単なソリューションの変換は次のとおりmessageです。

(defun my-message-with-timestamp (old-func fmt-string &rest args)
   "Prepend current timestamp (with microsecond precision) to a message"
   (apply old-func
          (concat (format-time-string "[%F %T.%3N %Z] ")
                   fmt-string)
          args))

次の*Messages*ような出力:

[2018-02-25 10:13:45.442 PST] Mark set

たす:

 (advice-add 'message :around #'my-message-with-timestamp)

削除する:

 (advice-remove 'message #'my-message-with-timestamp)

3
また、単にむしろアドバイスを中心に使用するよりも、引数をフィルタリングすることもできます(advice-add 'message :filter-args 'with-timestamp)。このような関数では動作します:(defun with-timestamp (args) (push (concat (format-time-string "[%F %T.%3N] ") (car args)) (cdr args)))
glucas

1
@glucasいいね!ミニバッファーの上にマウスを置くと、メッセージなしのタイムスタンプが表示されます。それを回避する方法はありますか?
AstroFloyd 2019

3

https://www.emacswiki.org/emacs/DebugMessagesから参照してください

(defadvice message (before when-was-that activate)
  "Add timestamps to `message' output."
  (ad-set-arg 0 (concat (format-time-string "[%Y-%m-%d %T %Z] ") 
                        (ad-get-arg 0)) ))

最後に、私はまだのようスチュアートHickinbottomそれはミニバッファでのショータイムスタンプを避けるための答え、以下は私が使用し、それはメッセージだけ(でエコー領域に表示無視修正版であるlet message-log-maxnilメッセージ関数呼び出しの前には):

 (defun my/ad-timestamp-message (FORMAT-STRING &rest args)
   "Advice to run before `message' that prepends a timestamp to each message.
    Activate this advice with:
      (advice-add 'message :before 'my/ad-timestamp-message)
    Deactivate this advice with:
      (advice-remove 'message 'my/ad-timestamp-message)"
       (if message-log-max
           (let ((deactivate-mark nil)
                 (inhibit-read-only t))
             (with-current-buffer "*Messages*"
               (goto-char (point-max))
               (if (not (bolp))
                   (newline))
               (insert (format-time-string "[%F %T.%3N] "))))))
 (advice-add 'message :before 'my/ad-timestamp-message)

2
タイムスタンプ形式を%F %T.%3Nshow
microsecondsに
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.