aboutsummaryrefslogtreecommitdiff
path: root/modules/custom-datetime.el
blob: 0528688c256f9538f0b2aac9f8862d785eccddb4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
;;; custom-datetime.el --- Insert formatted date and time strings -*- coding: utf-8; lexical-binding: t; -*-

;;; Commentary:
;;
;; Layer: 2 (Core UX).
;; Category: L/C.
;; Load shape: eager.
;; Eager reason: registers its C-; d datetime submap at load. Currently eager by
;;   init order; a deferral candidate for Phase 3/4 (command/autoload +
;;   registration API).
;; Top-level side effects: defines cj/datetime-map, registers it under C-; d.
;; Runtime requires: keybindings.
;; Direct test load: yes (requires keybindings explicitly).
;;
;; Date/time insertion commands under C-; d. Each command is generated from a
;; customizable format variable and inserts format-time-string output at point.
;;
;;; Code:

(require 'keybindings)  ;; provides cj/custom-keymap

(defmacro cj/--define-datetime-inserter (name format-var thing)
  "Define interactive command NAME inserting the current THING at point.
THING is a short noun phrase (\"date and time\", \"time\", \"date\") used in
the docstring.  The inserted text is `format-time-string' applied to
FORMAT-VAR's value, so customizing FORMAT-VAR changes the output."
  (declare (indent defun))
  `(defun ,name ()
     ,(format "Insert the current %s into the current buffer.\nUse `%s' for formatting."
              thing format-var)
     (interactive)
     (insert (format-time-string ,format-var (current-time)))))

;; ----------------------------- Readable Date Time ----------------------------

(defvar readable-date-time-format "%A, %B %d, %Y at %I:%M:%S %p %Z "
  "Format string used by `cj/insert-readable-date-time'.
See `format-time-string' for possible replacements.")

(cj/--define-datetime-inserter cj/insert-readable-date-time
  readable-date-time-format "date and time")

;; ----------------------------- Sortable Date Time ----------------------------

(defvar sortable-date-time-format "%Y-%m-%d %a @ %H:%M:%S %z "
  "Format string used by `cj/insert-sortable-date-time'.
See `format-time-string' for possible replacements.")

(cj/--define-datetime-inserter cj/insert-sortable-date-time
  sortable-date-time-format "date and time")

;; ------------------------------- Sortable Time -------------------------------

(defvar sortable-time-format "%I:%M:%S %p %Z "
  "Format string used by `cj/insert-sortable-time'.
See `format-time-string' for possible replacements.")

(cj/--define-datetime-inserter cj/insert-sortable-time
  sortable-time-format "time")

;; ------------------------------- Readable Time -------------------------------

(defvar readable-time-format  "%-I:%M %p "
  "Format string used by `cj/insert-readable-time'.
See `format-time-string' for possible replacements.")

(cj/--define-datetime-inserter cj/insert-readable-time
  readable-time-format "time")

;; ------------------------------- Sortable Date -------------------------------

(defvar sortable-date-format "%Y-%m-%d %a"
  "Format string used by `cj/insert-sortable-date'.
See `format-time-string' for possible replacements.")

(cj/--define-datetime-inserter cj/insert-sortable-date
  sortable-date-format "date")

;; ------------------------------- Readable Date -------------------------------

(defvar readable-date-format "%A, %B %d, %Y"
  "Format string used by `cj/insert-readable-date'.
See `format-time-string' for possible replacements.")

(cj/--define-datetime-inserter cj/insert-readable-date
  readable-date-format "date")

;; ------------------------------ Date Time Keymap -----------------------------

(defvar-keymap cj/datetime-map
  :doc "Keymap for date/time insertions."
  "r" #'cj/insert-readable-date-time
  "s" #'cj/insert-sortable-date-time
  "t" #'cj/insert-sortable-time
  "T" #'cj/insert-readable-time
  "d" #'cj/insert-sortable-date
  "D" #'cj/insert-readable-date )
(cj/register-prefix-map "d" cj/datetime-map)

(with-eval-after-load 'which-key
  (which-key-add-key-based-replacements
    "C-; d" "date/time insertion menu"
    "C-; d r" "readable date-time"
    "C-; d s" "sortable date-time"
    "C-; d t" "sortable time"
    "C-; d T" "readable time"
    "C-; d d" "sortable date"
    "C-; d D" "readable date"))

(provide 'custom-datetime)
;;; custom-datetime.el ends here.