aboutsummaryrefslogtreecommitdiff
path: root/modules/custom-datetime.el
blob: 6bca494d8b4a3495db983c33c9976333229c758e (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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
;;; custom-datetime.el ---  -*- 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).
;;
;; Utilities for inserting date/time stamps in multiple formats.
;;
;; Interactive commands:
;; - cj/insert-readable-date-time
;; - cj/insert-sortable-date-time
;; - cj/insert-sortable-time
;; - cj/insert-readable-time
;; - cj/insert-sortable-date
;; - cj/insert-readable-date
;;
;; Each command is generated by `cj/--define-datetime-inserter' from a
;; corresponding format variable:
;;   readable-date-time-format, sortable-date-time-format,
;;   sortable-time-format, readable-time-format,
;;   sortable-date-format, readable-date-format.
;; Customize these (see `format-time-string') to change output.
;; Some defaults include a trailing space for convenient typing.
;;
;; Key bindings:
;; A prefix map `cj/datetime-map' is installed on "d" under `cj/custom-keymap':
;;   r → readable date+time
;;   s → sortable date+time
;;   t → sortable time
;;   T → readable time
;;   d → sortable date
;;   D → readable date
;;
;;; 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.