Emacs के * मेसेज * बफर में प्रत्येक प्रविष्टि के लिए टाइमस्टैम्प कैसे जोड़ें?


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आदेश सी में कार्यान्वित किया जाता है और संभावना है, प्रत्यक्ष कॉल है ताकि आप हर लॉग इन संदेश Emacs अपने आप को निर्माण के बिना एक टाइमस्टैम्प हो जाता है यह सुनिश्चित करने के लिए सक्षम नहीं होंगे। उस ने कहा, आप messageकमांड को सलाह दे सकते हैं कि वह एलिस्प से बुलाए जाने पर एक टाइम स्टैम्प शुरू करे। कुछ सावधानी बरतने की आवश्यकता है: messageबिना किसी आर्गन, एक खाली प्रारूप स्ट्रिंग, आदि के साथ बुलाया जा सकता है। आप एक पुनरावर्ती लूप से भी बचना चाहते हैं, आपकी टाइमस्टैम्प सलाह खुद messageको कुछ कोड पथ में कॉल करना चाहिए ।
ग्लूकोज

1
मैंने इसे आज़माया नहीं है, लेकिन ऐसा लगता है कि आपको संदेश emacswiki.org/emacs/AdvisingFunctions stackoverflow.com/questions/21524488// superuser.com/questions-669701/…
eflanigan00

1
मैं after-change-functions(संदेशों को बफर में) का उपयोग करने के लिए इच्छुक हूँ कि लागू करने के लिए। जब भी बफर के अंत में कुछ डाला जाता है, तो एक टाइमस्टैम्प को उपसर्ग करें।
फिल्स

1
@phils से देखें gnu.org/software/emacs/manual/html_node/elisp/Change-Hooks.html संदेश बफर में संदेशों का आउटपुट इन कार्यों को कॉल नहीं करता है, और न ही कुछ आंतरिक बफर परिवर्तन, जैसे बफ़र्स में परिवर्तन। Emacs द्वारा आंतरिक रूप से कुछ नौकरियों के लिए, जो कि लिस्प कार्यक्रमों को दिखाई नहीं देना चाहिए।
xinfa तांग

जवाबों:


7

मेरे init.el में निम्नलिखित स्निपेट हैं, जिन्हें मैं निम्नलिखित Reddit थ्रेड में पाए गए मूल से अनुकूलित किया गया था: http://www.reddit.com/r/emacs/comments/16tzu9/anyone_know_of_a_reasonable_way_to_timestamp/

(EDIT: सलाह देने के लिए आधुनिकीकरण किया गया है और @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)

इसके परिणामस्वरूप * संदेश * बफर की सजावट इस प्रकार है:

[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
मुझे आश्चर्य है कि क्यों यह डिफ़ॉल्ट रूप से एक विकल्प के रूप में प्रदान नहीं किया गया है।
बर्टफ्रेड

1
शानदार, यह वही है जो मैं देख रहा था। धन्यवाद।
gsl

2
@bertfred क्योंकि किसी ने ऐसा नहीं किया है। शायद, वह तुम हो?
फिल लॉर्ड

2
क्या आप सलाह का उपयोग करके फिर से लिख सकते हैं advice-add? यह अब पसंदीदा तरीका है, क्योंकि यह जानता है कि ऐसी स्थितियों को कैसे संभालना है defadvice। इसके अलावा, आपको शायद ऐसा नहीं करना चाहिए (read-only-mode 0), क्योंकि यह शायद स्थायी है। आप बाध्य कर सकते हैं inhibit-read-onlyकरने के लिए tकोड है कि संशोधित बफर के आसपास।
सुबह

2
मैं आपके कोड का उपयोग करता हूं, लेकिन कई संदेश सिर्फ टाइमस्टैम्प पर प्रदर्शित करता
हूं

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
तुम भी बस args फ़िल्टर कर सकते हैं, बजाय सलाह के आसपास का उपयोग कर: (advice-add 'message :filter-args 'with-timestamp)इस तरह से एक समारोह के साथ काम करेंगे:(defun with-timestamp (args) (push (concat (format-time-string "[%F %T.%3N] ") (car args)) (cdr args)))
ग्लूकास

1
@glucas अच्छा लगा! जब मैं मिनीबार पर माउस को घुमाता हूँ तो मुझे टाइमस्टैम्प्स w / o संदेश मिलता है। क्या इससे बचने का कोई तरीका है?
एस्ट्रोफ्लोयड

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

अंत में मैं अभी भी स्टुअर्ट हिकिनबॉटम का उत्तर पसंद करता हूं , क्योंकि यह मिनीबफ़र में टाइमस्टैम्प दिखाने से बचता है, निम्नलिखित एक संशोधित संस्करण है जिसका मैं उपयोग करता हूं, यह केवल इको क्षेत्र में संदेश दिखाता है ( संदेश फ़ंक्शन कॉल let message-log-maxकरने nilसे पहले):

 (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.%3Nमाइक्रोसेकंड दिखाने के लिए टाइमस्टैम्प प्रारूप बदलें
xinfa tang
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.