Emacs: tmr version 1.4.0
TMR provides facilities for setting timers using a convenient notation. Lots of commands are available to operate on timers, while there also exists a tabulated view to display all timers in a nice grid.
- Package name (GNU ELPA):
tmr - Official manual: https://protesilaos.com/emacs/tmr
- Change log: https://protesilaos.com/emacs/tmr-changelog
- Git repositories:
- GitHub: https://github.com/protesilaos/tmr
- GitLab: https://gitlab.com/protesilaos/tmr
- Video demonstration: https://protesilaos.com/codelog/2026-01-19-emacs-timers-tmr-demo/
- Backronym: TMR May Ring; Timer Must Run.
Below are the release notes.
Version 1.4.0 on 2026-07-31
TMR is an efficient package that has been stable for years. This new version introduces some nice new features as well as several smaller internal refinements.
Create a timer that repeats
The command tmr-repeat prompts for a duration, like the standard
tmr command but also asks for a number of times to repeat the given
timer. When called with a prefix argument (C-u with default
keybindings), tmr-repeat will also ask for a description for the new
timer and whether it should be acknowledged or not after all
repetitions have elapsed.
Thanks to Óscar Fuentes for contributing the original implementation
of tmr-repeat (with many extra changes/features by me). This was
done in pull request 16: https://github.com/protesilaos/tmr/pull/16.
Óscar has assigned copyright to the Free Software Foundation.
Modify the repeat count of an existing timer
The command tmr-edit-repeat-count prompts for an existing timer and
updates its repeat count. If the repeat count is set to 0, then the
timer is no longer considered repeatable.
As with all commands that operate on existing timers, tmr-edit-repeat-count
automatically applies to the timer at point when called from inside
the tabulated list of timers (per tmr-tabulated-view).
Modifying a timer’s repeat count does not start a new timer. It simply
updates the relevant data. Use the command tmr-clone to start a new
timer using the data of an existing timer.
The tabulated view has more columns and all of them can be adjusted
The tabulated list of timers, which is typically produced by the
command tmr-tabulated-view, now has extra columns for the data that
pertains to repeatable timers.
Users who want to control which columns are displayed, and in what
order, can modify the user option tmr-tabulated-columns. Its
documentation covers the technicalities. The default value is to
display all columns.
Completion metadata for the prompt that selects a timer
Advanced users can now modify all the completion-metadata associated
with the prompt that reads/selects one among the existing timer
objects (the function is tmr-read-timer). The relevant variable is
tmr-completion-metadata. I am not providing this as a user option,
because regular users will anyway not be able to do much with it as it
involves custom functions.
Timers in the completion prompt are sorted by end time
The prompt for selecting a timer now sorts candidates by their end time. The closest end time appears at the top.
This affects all commands that operate on a timer, such as
tmr-edit-repeat-count, tmr-cancel, and more.
In the past, there was no sorting whatsoever. Users who prefer that style can add the following to their configuration:
(setq tmr-completion-metadata
(list
(cons 'category 'tmr-timer)
(cons 'display-sort-function #'identity) ; THIS IS THE RELEVANT PART
(cons 'annotation-function #'tmr-completion-annotate)))
Miscellaneous
-
The manual is easier to read. I have rewritten it to group commands and user options under appropriate headings.
-
Lots of internal refinements to the code. I tweaks things to make the code easier to maintain and contribute to.
-
Thanks to Pavlo Lysov for adding a small example to the manual about using TMR hooks to send a custom notification on the macOS. This was done in pull request 25: https://github.com/protesilaos/tmr/pull/25. Pavlo does not need to assign copyright to the Free Software Foundation.
-
Thanks to Carlos Pajuelo Rojo for refining an earlier version of the function that produces a message about the repeat count of a given timer (I have since made lots of changes on this and other fronts). Carlos’ contribution is in pull request 20: https://github.com/protesilaos/tmr/pull/20. The change is small, meaning that Carlos does not need to assign copyright to the Free Software Foundation.
-
Thanks to f6p for use the appropriate face for the paused indicator in the tabulated view. This was done in pull request 17: https://github.com/protesilaos/tmr/pull/17. The change is small, meaning that the author does not need to assign copyright to the Free Software Foundation.