Version 0.4.0 of package Tmr has just been released in GNU ELPA.
You can now find it in M-x package-list RET.
Tmr describes itself as:
Set timers using a convenient notation
More at https://elpa.gnu.org/packages/tmr.html
Recent NEWS:
━━━━━━━━━━━━━━━━━━━
CHANGE LOG OF TMR
━━━━━━━━━━━━━━━━━━━
This document contains the release notes for each tagged commit on the
project's main git repository: <https://git.sr.ht/~protesilaos/tmr>.
The newest release is at the top. For further details, please consult
the manual: <https://protesilaos.com/emacs/tmr>.
Version 0.4.0 on 2022-07-07
═══════════════════════════
The general theme of this release is that TMR became simpler, better,
and more robust. Daniel Mendler provided lots of patches and is now
recognised as co-author of the package together with Damien Cassou and
me (Protesilaos). With the exception of documentation changes and
other accompanying tweaks, all of the following are courtesy of Daniel
Mendler. Consult the git log for the minutia.
⁃ Timers can also be set using an absolute time input. For example,
`21:45' will set a timer from now until the specified time. The
familiar ways of starting timers with relative values, work as they
did before. This is part of a wider internal revision to make the
parsing of input more strict.
⁃ TMR no longer maintains distinct feature sets between its minibuffer
and tabulated interfaces. What works in one context, works equally
in the other. All commands that were formerly available only in the
`tmr-tabulated-mode' (accessed via `tmr-tabulated-view') are now
implemented anew to provide the requisite minibuffer capabilities.
When called from inside the `tmr-tabulated-mode', the commands
operate on the timer at point. Otherwise they prompt for completion
among the available timers (where relevant). This covers all
operations for creating, cloning, [re-]describing, rescheduling, and
removing timers. The `tmr-tabulated-mode-map' is updated thus:
┌────
│ (defvar tmr-tabulated-mode-map
│ (let ((map (make-sparse-keymap)))
│ (define-key map "k" #'tmr-remove)
│ (define-key map "r" #'tmr-remove)
│ (define-key map "R" #'tmr-remove-finished)
│ (define-key map "+" #'tmr)
│ (define-key map "t" #'tmr)
│ (define-key map "*" #'tmr-with-description)
│ (define-key map "T" #'tmr-with-description)
│ (define-key map "c" #'tmr-clone)
│ (define-key map "e" #'tmr-edit-description)
│ (define-key map "s" #'tmr-reschedule)
│ map)
│ "Keybindings for `tmr-tabulated-mode-map'.")
└────
Similarly, our sample key bindings are these:
┌────
│ ;; OPTIONALLY set your own global key bindings:
│ (let ((map global-map))
│ (define-key map (kbd "C-c t t") #'tmr)
│ (define-key map (kbd "C-c t T") #'tmr-with-description)
│ (define-key map (kbd "C-c t l") #'tmr-tabulated-view) ; "list timers" mnemonic
│ (define-key map (kbd "C-c t c") #'tmr-clone)
│ (define-key map (kbd "C-c t k") #'tmr-cancel)
│ (define-key map (kbd "C-c t s") #'tmr-reschedule)
│ (define-key map (kbd "C-c t e") #'tmr-edit-description)
│ (define-key map (kbd "C-c t r") #'tmr-remove)
│ (define-key map (kbd "C-c t R") #'tmr-remove-finished))
└────
⁃ The tabulated view now shows the remaining time for all timer
objects. This is how the `*tmr-tabulated-view*' buffer is
formatted:
┌────
│ Start End Remaining Description
│ 10:11:49 10:11:54 ✔
│ 10:11:36 10:31:36 19m 35s
│ 10:11:32 10:26:32 14m 31s Yet another test
│ 10:11:16 10:21:16 9m 14s Testing how it works
└────
⁃ All timer objects are refactored to expose a properly formatted
completion table. The completion category is `tmr-timer'. In
practical terms, `embark' (and other standards-compliant packages)
can operate on them. The manual provides sample glue code for
Embark:
#+begin_src emacs-lisp (defvar tmr-action-map (let ((map
(make-sparse-keymap))) (define-key map "k" #'tmr-remove) (define-key
map "r" #'tmr-remove) (define-key map "R" #'tmr-remove-finished)
(define-key map "c" #'tmr-clone)
… …