emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/tmr 14fe997e9f 1/3: Improve Embark support


From: ELPA Syncer
Subject: [elpa] externals/tmr 14fe997e9f 1/3: Improve Embark support
Date: Wed, 29 Jun 2022 01:59:05 -0400 (EDT)

branch: externals/tmr
commit 14fe997e9fc874c8ab95980d3c89c39731e89190
Author: Daniel Mendler <mail@daniel-mendler.de>
Commit: Protesilaos Stavrou <info@protesilaos.com>

    Improve Embark support
    
    In order to better support Embark we make sure that the TMR
    formatting is consistent across completion sessions. The
    remaining time is displayed via an annotation-function.
---
 tmr.el | 78 +++++++++++++++++++++++++++---------------------------------------
 1 file changed, 32 insertions(+), 46 deletions(-)

diff --git a/tmr.el b/tmr.el
index 11adc73c28..b15cdc8f4b 100644
--- a/tmr.el
+++ b/tmr.el
@@ -128,17 +128,16 @@ Each function must accept a timer as argument."
   "Return a human-readable description for TIMER."
   (let ((start (tmr--format-creation-date timer))
         (end (tmr--format-end-date timer))
-        (remaining (tmr--format-remaining timer "finished" "in "))
         (description (tmr--timer-description timer)))
     ;; We prefix it with TMR just so it is easier to find in
     ;; `view-echo-area-messages'.  The concise wording makes it flexible
     ;; enough to be used when starting a timer but also when cancelling
     ;; one: check `tmr-print-message-for-created-timer' and
     ;; `tmr-print-message-for-cancelled-timer'.
-    (format "TMR start at %s; end at %s; %s%s"
+    (format "TMR start %s; end %s; duration %s%s"
             (propertize start 'face 'success)
             (propertize end 'face 'error)
-            remaining
+            (tmr--timer-input timer)
             (if description
                 (format " [%s]" (propertize description 'face 'bold))
               ""))))
@@ -158,24 +157,6 @@ optional `tmr--timer-description'."
             (propertize "Ended" 'face 'error)
             end)))
 
-(defun tmr--long-description-for-clonable-timer (timer)
-  "Return a human-readable description for clonable TIMER.
-This is like `tmr--long-description' with the inclusion of the
-original input for TIMER's duration."
-  (let ((start (tmr--format-creation-date timer))
-        (end (tmr--format-end-date timer))
-        (remaining (tmr--format-remaining timer "finished" "in "))
-        (description (tmr--timer-description timer))
-        (input (tmr--timer-input timer)))
-    (format "TMR start at %s; end at %s; %s%s (input was '%s')"
-            (propertize start 'face 'success)
-            (propertize end 'face 'error)
-            remaining
-            (if description
-                (format " [%s]" (propertize description 'face 'bold))
-              "")
-            (propertize input 'face 'warning))))
-
 (defun tmr--format-creation-date (timer)
   "Return a string representing when TIMER was created."
   (tmr--format-time (tmr--timer-creation-date timer)))
@@ -184,20 +165,17 @@ original input for TIMER's duration."
   "Return a string representing when TIMER should finish."
   (tmr--format-time (tmr--timer-end-date timer)))
 
-(defun tmr--format-remaining (timer &optional finished prefix)
-  "Format remaining time of TIMER.
-FINISHED is the string used for finished timers.
-PREFIX is used as prefix for running timers."
-  (setq prefix (or prefix ""))
+(defun tmr--format-remaining (timer)
+  "Format remaining time of TIMER."
   (if (tmr--timer-finishedp timer)
-      (or finished "✔")
+      "✔"
     (let ((secs (round (- (float-time (tmr--timer-end-date timer))
                           (float-time)))))
       (if (> secs 3600)
-          (format "%s%sh %sm" prefix (/ secs 3600) (/ (% secs 3600) 60))
+          (format "%sh %sm" (/ secs 3600) (/ (% secs 3600) 60))
         (if (> secs 60)
-            (format "%s%sm %ss" prefix (/ secs 60) (% secs 60))
-          (format "%s%ss" prefix secs))))))
+            (format "%sm %ss" (/ secs 60) (% secs 60))
+          (format "%ss" secs))))))
 
 (defun tmr--format-time (time)
   "Return a human-readable string representing TIME."
@@ -274,17 +252,21 @@ cancelling the original one."
 (defvar tmr--read-timer-hook nil
   "Hooks to execute to find current timer.")
 
-(defun tmr--read-timer (&optional active description)
+(defun tmr--timer-annotation (timer)
+  "Annotate TIMER completion candidate with remaining time."
+  (setq timer (get-text-property 0 'tmr-timer timer))
+  (if (tmr--timer-finishedp timer)
+      " (finished)"
+    (format " (%s remaining)" (tmr--format-remaining timer))))
+
+(defun tmr--read-timer (&optional active)
   "Let the user choose a timer among all timers.
 Return the selected timer.  If there is a single timer, use that.
 If there are multiple timers, prompt for one with completion.  If
 there are no timers, return nil.
 
 If optional ACTIVE is non-nil, limit the list of timers to those
-that are still running.
-
-If optional DESCRIPTION function is provided use it to format the
-completion candidates."
+that are still running."
   (or
    (run-hook-with-args-until-success 'tmr--read-timer-hook)
    (pcase
@@ -294,16 +276,20 @@ completion candidates."
      ('nil (user-error "No timers available"))
      (`(,timer) timer)
      (timers
-      (let* ((formatter (or description #'tmr--long-description))
-             (timer-alist (mapcar
-                           (lambda (x)
-                             (cons (funcall formatter x) x))
-                           timers)))
-        (cdr (assoc (completing-read
-                     "Timer: "
-                     (tmr--completion-table timer-alist 'tmr-timer)
-                     nil t)
-                    timer-alist)))))))
+      (let* ((timer-list (mapcar
+                          (lambda (x)
+                            (propertize
+                             (tmr--long-description x)
+                             'tmr-timer x))
+                          timers))
+             (selected
+              (car (member (completing-read
+                            "Timer: "
+                            (tmr--completion-table
+                             timer-list 'tmr-timer #'tmr--timer-annotation)
+                            nil t)
+                           timer-list))))
+        (and selected (get-text-property 0 'tmr-timer selected)))))))
 
 ;; NOTE 2022-04-21: Emacs has a `play-sound' function but it only
 ;; supports .wav and .au formats.  Also, it does not work on all
@@ -433,7 +419,7 @@ argument, ask for a description as well.
 Without a PROMPT, clone TIMER outright."
   (interactive
    (list
-    (tmr--read-timer nil #'tmr--long-description-for-clonable-timer)
+    (tmr--read-timer nil)
     current-prefix-arg))
   (tmr
    (if prompt



reply via email to

[Prev in Thread] Current Thread [Next in Thread]