Emacs'ın * Mesajlar * arabelleğindeki her girişe zaman damgası nasıl eklenir?


11

Ben bağımlı *Messages*tampon çok ama girişler timestamped değildir.

Emacs'ın Mesajlar arabelleğindeki her bir girişe zaman damgası nasıl eklenebilir ?

Yani böyle bir şey:

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]

böyle bir şey olacak:

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 ve emacs.sx üzerinde elbette boşuna aradım.

Biliyorum command-log-mode, zaman damgalarıyla günlüğe kaydedilebilecek şekilde ayarlanabilir, ancak Emacs'ın "sistem" olanlar da dahil olmak üzere tüm iletiler için değil, yalnızca etkileşimli komutlar için yararlıdır.

Bunun yerine, Mesajlar arabelleğine kaydedilen her mesajın zaman damgası olmalıdır.

Kaynağı ne olursa olsun Emacs'ın Mesajlar arabelleğindeki her girişe nasıl bir zaman damgası eklenebilir ?


2
Bu Emacs için bir özellik isteği gibi geliyor. messageKomut C uygulanan ve her oturum açan mesaj emacs'in kendinizi bina olmadan bir zaman damgası ulaştırmak için mümkün olmayacaktır böylece olasılıkla, direkt arayanları vardır. Bununla messagebirlikte, Elisp'ten çağrıldığında bir zaman damgası başlatma komutunu önerebilirsiniz. Dikkatli olunması gereken bir nokta vardır: bağımsız değişken message, boş biçim dizesi vb. Olmadan çağrılabilir. Ayrıca zaman damgası tavsiyenizin messagebazı kod yollarını çağırması durumunda yinelemeli bir döngüden kaçınmak istersiniz .
glucas


1
Bunu uygulamak için after-change-functions(mesaj arabelleğinde) kullanmaya meyilli olurum . Tamponun sonuna bir şey eklendiğinde, zaman damgasının önüne ön ek uygulayın.
phils

1
@phils gelen bakınız gnu.org/software/emacs/manual/html_node/elisp/Change-Hooks.html içine mesajların Çıktı Mesajları bu işlevleri çağırmak ve ne tür oluşturulan tampon değişiklikler gibi bazı iç tampon değişiklikleri yapmaz tampon Emacs tarafından Lisp programları tarafından görülememesi gereken belirli işler için dahili olarak.
xinfa tang

Yanıtlar:


7

Aşağıdaki Reddit iş parçacığında bulduğum bir orijinalden uyarlanmış olan init.el dosyamda şu snippet var: http://www.reddit.com/r/emacs/comments/16tzu9/anyone_know_of_a_reasonable_way_to_timestamp/

(DÜZENLEME: @blujay'ın tavsiyesi üzerine tavsiye ekleme ve modernleştirilmiş salt okunur tampon işleme için modernize edildi)

(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)

Bu, * Mesajlar * arabelleğinin dekorasyonuyla şu şekilde sonuçlanır:

[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
Bunun neden varsayılan olarak bir seçenek olarak sunulmadığını merak ediyorum.
bertfred

1
Harika, tam da aradığım şey buydu. Teşekkür ederim.
gsl

2
@bertfred Çünkü kimse bunu başaramadı. Belki sen misin?
Phil Lord

2
Kullanarak tavsiyeyi yeniden yazabilir misiniz advice-add? Yapamayan durumların nasıl ele alınacağını bildiği için şimdi tercih edilen yöntem defadvice. Ayrıca, muhtemelen yapmamalısınız (read-only-mode 0), çünkü bu muhtemelen kalıcıdır. Sen bağlayabilir inhibit-read-onlyiçin tkod tuşelere o tampon etrafında.
blujay

2
Kodunuzu kullanıyorum, ancak birçok mesajı yalnızca bir zaman damgası görüntülüyorum
xinfa tang

5

@ Xinfatang'ın yeni advice-addsözdizimine yönelik basit çözümünün messagefonksiyonun etrafına sarıcı olarak çevirisi :

(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*Gibi çıktılar :

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

Eklemek:

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

Ayırmak:

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

3
Ayrıca tavsiye etrafında kullanmak yerine, sadece argümanları filtreleyebilirsiniz: (advice-add 'message :filter-args 'with-timestamp)böyle bir işlevle çalışır:(defun with-timestamp (args) (push (concat (format-time-string "[%F %T.%3N] ") (car args)) (cdr args)))
glucas

1
@glucas Güzel! Ben fare minibuffer üzerine geldiğinde mesaj olmadan w / o zaman damgaları alıyorum. Bundan kaçınmanın bir yolu var mı?
AstroFloyd

3

Https://www.emacswiki.org/emacs/DebugMesajlardan bakın :

(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)) ))

Nihayet ben hala gibi Stuart Hickinbottom o minibuffer gösteri damgası kaçınmak çünkü 'ın cevabı, aşağıdaki i kullanmak, bu iletiler yalnızca (tarafından yankı alanda göstermek görmezden değiştirilmiş bir versiyonu let message-log-maxiçin nilmesaj işlev çağrısı öncesi):

 (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 için zaman damgası biçimini değiştirin
xinfa tang
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.