From 2bf25672846a1d73dc14f5fe1f44f612eea61250 Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Sun, 15 Dec 2019 22:13:37 +0000 Subject: [PATCH] feat(emacs-pkgs): Check in separate dottime package This package adds a toggle for displaying modeline time in dottime, as well as a function for formatting time as dottime generically. --- tools/emacs-pkgs/dottime/default.nix | 7 ++++ tools/emacs-pkgs/dottime/dottime.el | 59 ++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 tools/emacs-pkgs/dottime/default.nix create mode 100644 tools/emacs-pkgs/dottime/dottime.el diff --git a/tools/emacs-pkgs/dottime/default.nix b/tools/emacs-pkgs/dottime/default.nix new file mode 100644 index 000000000..b09756dea --- /dev/null +++ b/tools/emacs-pkgs/dottime/default.nix @@ -0,0 +1,7 @@ +{ pkgs, ... }: + +pkgs.third_party.emacsPackagesNg.trivialBuild rec { + pname = "dottime"; + version = "1.0"; + src = ./dottime.el; +} diff --git a/tools/emacs-pkgs/dottime/dottime.el b/tools/emacs-pkgs/dottime/dottime.el new file mode 100644 index 000000000..7caeb2f2c --- /dev/null +++ b/tools/emacs-pkgs/dottime/dottime.el @@ -0,0 +1,59 @@ +;;; dottime.el --- use dottime in the modeline +;; +;; Copyright (C) 2019 Google Inc. +;; +;; Author: Vincent Ambo +;; 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)