tvl-depot/tools/emacs-pkgs/dottime/dottime.el

60 lines
1.8 KiB
EmacsLisp
Raw Normal View History

;;; dottime.el --- use dottime in the modeline
;;
;; Copyright (C) 2019 Google Inc.
;;
;; Author: Vincent Ambo <tazjin@google.com>
;; Version: 1.0
;; Package-Requires: (cl-lib)
;;
;;; Commentary:
;;
;; This package changes the display of time in the modeline to use
;; dottime (see https://dotti.me/) instead of the standard time
;; display.
;;
;; Modeline dottime display is enabled by calling
;; `dottime-display-mode' and dottime can be used in Lisp code via
;; `dottime-format'.
(require 'cl-lib)
(require 'time)
(defun dottime--format-string ()
"Creates the dottime format string for `format-time-string'
based on the local timezone."
(let* ((offset-sec (car (current-time-zone)))
(offset-hours (/ offset-sec 60 60)))
(if (/= offset-hours 0)
(concat "%m-%dT%H·%M" (format "%0+3d" offset-hours))
"%m-%dT%H·%M")))
(defun dottime--display-time-update-advice (orig)
"Function used as advice to `display-time-update' with a
rebound definition of `format-time-string' that renders all
timestamps as dottime."
(cl-letf* ((format-orig (symbol-function 'format-time-string))
((symbol-function 'format-time-string)
(lambda (&rest _)
(funcall format-orig (dottime--format-string) nil t))))
(funcall orig)))
(defun dottime-format (&optional time)
"Format the given TIME in dottime. If TIME is nil, the current
time will be used."
(format-time-string (dottime--format-string) time t))
(defun dottime-display-mode (arg)
"Enable time display as dottime. Disables dottime if called
with prefix 0 or nil."
(interactive "p")
(if (or (eq arg 0) (eq arg nil))
(advice-remove 'display-time-update #'dottime--display-time-update-advice)
(advice-add 'display-time-update :around #'dottime--display-time-update-advice))
(display-time-update))
(provide 'dottime)