Version 0.4.0 of package Tmr has just been released in GNU ELPA. You can now find it in M-x list-packages RET.
Tmr describes itself as: ====================================== Set timers using a convenient notation ====================================== More at https://elpa.gnu.org/packages/tmr.html ## Summary: ━━━━━━━━━━━━━━━━━━━━━━ TMR MAY RING Protesilaos Stavrou [email protected] ━━━━━━━━━━━━━━━━━━━━━━ This manual, written by Protesilaos Stavrou, describes the customization options for `tmr' (or TMR, TMR May Ring, …), and provides every other piece of information pertinent to it. The name of the package is pronounced as “timer” or “T-M-R”. The documentation furnished herein corresponds to stable version 0.4.0, released on 2022-07-07. Any reference to a newer feature which does not yet form part of the latest tagged commit, is explicitly marked as such. Current development target is 0.5.0-dev. ## 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) … …
