summaryrefslogtreecommitdiff
path: root/modules/custom-datetime.el
blob: c195ebc226eb80e35fde3aaeb20207aa2096513c (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
;;; custom-datetime.el ---  -*- coding: utf-8; lexical-binding: t; -*-

;;; Commentary:
;; 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 uses 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:

;; cj/custom-keymap defined in keybindings.el
(eval-when-compile (defvar cj/custom-keymap))

;; ----------------------------- 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.")

(defun cj/insert-readable-date-time ()
  "Insert the current date and time into the current buffer.
Use `readable-date-time-format' for formatting."
  (interactive)
  (insert (format-time-string readable-date-time-format (current-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.")

(defun cj/insert-sortable-date-time ()
  "Insert the current date and time into the current buffer.
Use `sortable-date-time-format' for formatting."
  (interactive)
  (insert (format-time-string sortable-date-time-format (current-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.")

(defun cj/insert-sortable-time ()
  "Insert the current time into the current buffer.
Use `sortable-time-format' for formatting."
  (interactive)
  (insert (format-time-string sortable-time-format (current-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.")

(defun cj/insert-readable-time ()
  "Insert the current time into the current buffer.
Use `readable-time-format' for formatting."
  (interactive)
  (insert (format-time-string readable-time-format (current-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.")

(defun cj/insert-sortable-date ()
  "Insert the current date into the current buffer.
Use `sortable-date-format' for formatting."
  (interactive)
  (insert (format-time-string sortable-date-format (current-time))))

;; ------------------------------- 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.")

(defun cj/insert-readable-date ()
  "Insert the current date into the current buffer.
Use `readable-date-format' for formatting."
  (interactive)
  (insert (format-time-string readable-date-format (current-time))))

;; ------------------------------ 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 )
(keymap-set cj/custom-keymap "d" cj/datetime-map)

(with-eval-after-load 'which-key
  (which-key-add-key-based-replacements "C-; d" "date/time insertion menu"))

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