diff options
| author | Craig Jennings <c@cjennings.net> | 2025-10-12 11:47:26 -0500 |
|---|---|---|
| committer | Craig Jennings <c@cjennings.net> | 2025-10-12 11:47:26 -0500 |
| commit | 092304d9e0ccc37cc0ddaa9b136457e56a1cac20 (patch) | |
| tree | ea81999b8442246c978b364dd90e8c752af50db5 /modules/chrono-tools.el | |
changing repositories
Diffstat (limited to 'modules/chrono-tools.el')
| -rw-r--r-- | modules/chrono-tools.el | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/modules/chrono-tools.el b/modules/chrono-tools.el new file mode 100644 index 00000000..f6c4c0f6 --- /dev/null +++ b/modules/chrono-tools.el @@ -0,0 +1,118 @@ +;;; chrono-tools.el --- Config for Date and Time-Related Utils -*- lexical-binding: t; coding: utf-8; -*- +;; author Craig Jennings <c@cjennings.net> +;; +;;; Commentary: +;; +;; This module centralizes configuration for Emacs time-related tools: +;; +;; – world-clock: predefined city list and custom time format +;; – calendar: quick navigation keybindings by day, month, and year +;; – tmr: lightweight timer setup with sounds, notifications, and history +;; +;;; Code: + +(require 'user-constants) + +(use-package time + :ensure nil ;; built-in + :defer 0.5 + :bind ("C-x c" . world-clock) + :config + (setq world-clock-list + '(("Pacific/Honolulu" " Honolulu") + ("America/Los_Angeles" " San Francisco, LA") + ("America/Chicago" " Chicago, New Orleans") + ("America/New_York" " New York, Boston") + ("Etc/UTC" " UTC =================") + ("Europe/London" " London, Lisbon") + ("Europe/Paris" " Paris, Berlin, Rome") + ("Europe/Athens" " Athens, Istanbul, Moscow") + ("Asia/Kolkata" " India") + ("Asia/Shanghai" " Shanghai, Singapore") + ("Asia/Tokyo" " Tokyo, Seoul"))) + (setq world-clock-time-format " %a, %d %b @ %I:%M %p %Z")) + +(use-package calendar + :ensure nil ;; built-in + :defer 0.5 + :bind (("M-#" . calendar) + :map calendar-mode-map + ("," . calendar-backward-day) + ("." . calendar-forward-day) + ("<" . calendar-backward-month) + (">" . calendar-forward-month) + ("M-," . calendar-backward-year) + ("M-." . calendar-forward-year))) + + +;; ------------------------------------ TMR ------------------------------------ + +(defun cj/tmr-select-sound-file () + "Select a sound file from `sounds-dir' to use for tmr timers. + +Present all audio files in the sounds directory and set the chosen file as +`tmr-sound-file'. Use \\[universal-argument] to reset to the default sound." + (interactive) + (if current-prefix-arg + ;; With prefix arg, reset to default + (progn + (setq tmr-sound-file notification-sound) + (message "Timer sound reset to default: %s" + (file-name-nondirectory notification-sound))) + ;; Otherwise, select a new sound + (let* ((audio-extensions '("mp3" "m4a" "ogg" "opus" "wav" "flac" "aac")) + (extension-regex (concat "\\." (regexp-opt audio-extensions t) "$")) + (sound-files (when (file-directory-p sounds-dir) + (directory-files sounds-dir nil extension-regex))) + (current-file (when (and tmr-sound-file (file-exists-p tmr-sound-file)) + (file-name-nondirectory tmr-sound-file))) + (selected-file (when sound-files + (completing-read + (format "Select timer sound%s: " + (if current-file + (format " (current: %s)" current-file) + "")) + sound-files + nil + t + nil + nil + current-file)))) ; Default to current file + (cond + ((not (file-directory-p sounds-dir)) + (message "Sounds directory does not exist: %s" sounds-dir)) + ((null sound-files) + (message "No audio files found in %s" sounds-dir)) + (selected-file + (setq tmr-sound-file (expand-file-name selected-file sounds-dir)) + (when (equal tmr-sound-file notification-sound) + (message "Timer sound set to default: %s" selected-file)) + (unless (equal tmr-sound-file notification-sound) + (message "Timer sound set to: %s" selected-file))) + (t + (message "No file selected")))))) + +(defun cj/tmr-reset-sound-to-default () + "Reset the tmr sound file to the default notification sound." + (interactive) + (setq tmr-sound-file notification-sound) + (message "Timer sound reset to default: %s" + (file-name-nondirectory notification-package))) + +(use-package tmr + :defer 0.5 + :init + (global-unset-key (kbd "M-t")) + :bind (("M-t" . tmr-prefix-map) + :map tmr-prefix-map + ("*" . tmr) + ("t" . tmr-with-details) + ("S" . cj/tmr-select-sound-file) + ("R" . cj/tmr-reset-sound-to-default)) + :config + (setq tmr-sound-file notification-sound) + (setq tmr-notification-urgency 'normal) + (setq tmr-descriptions-list 'tmr-description-history)) + +(provide 'chrono-tools) +;;; chrono-tools.el ends here |
