summaryrefslogtreecommitdiff
path: root/modules/chrono-tools.el
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2025-10-12 11:47:26 -0500
committerCraig Jennings <c@cjennings.net>2025-10-12 11:47:26 -0500
commit092304d9e0ccc37cc0ddaa9b136457e56a1cac20 (patch)
treeea81999b8442246c978b364dd90e8c752af50db5 /modules/chrono-tools.el
changing repositories
Diffstat (limited to 'modules/chrono-tools.el')
-rw-r--r--modules/chrono-tools.el118
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