;; moe-theme-switcher.el
|
|
;; Author: kuanyui (azazabc123@gmail.com)
|
|
;; Date: 2013/05/11 11:39
|
|
;;
|
|
;; This file is not a part of GNU Emacs,
|
|
;; but this file is released under GPL v3.
|
|
|
|
(require 'moe-dark-theme)
|
|
(require 'moe-light-theme)
|
|
(require 'moe-theme)
|
|
|
|
(defvar moe-theme-switch-by-sunrise-and-sunset t
|
|
"Automatically switch between dark and light moe-theme.
|
|
|
|
If this value is nil, moe-theme will switch at fixed time (06:00 and 18:00).
|
|
|
|
If this value is t and both calendar-latitude and calendar-longitude are set
|
|
properly, the switching will be triggered at the sunrise and sunset time of the
|
|
local calendar.
|
|
|
|
Take Keelung, Taiwan(25N,121E) for example, you can set like this:
|
|
|
|
(setq calendar-latitude +25)
|
|
(setq calendar-longitude +121)"
|
|
)
|
|
|
|
(defvar moe-theme-which-enabled nil
|
|
"Variable indicate which theme (moe-dark or light) is being used.")
|
|
|
|
(defun moe-load-theme (switch-to)
|
|
"Avoid unnecessary load-theme and screen flashing in GUI version Emacs"
|
|
(cond ((equal switch-to 'light)
|
|
(if (not (equal moe-theme-which-enabled 'light))
|
|
(progn (moe-light)
|
|
(setq moe-theme-which-enabled 'light)))) ;[FIXME] Maybe unnecessary
|
|
((equal switch-to 'dark)
|
|
(if (not (equal moe-theme-which-enabled 'dark))
|
|
(progn (moe-dark)
|
|
(setq moe-theme-which-enabled 'dark)))))) ;[FIXME] Maybe unnecessary
|
|
|
|
(defun switch-at-fixed-time ()
|
|
(let ((now (string-to-number (format-time-string "%H"))))
|
|
(if (and (>= now 06) (<= now 18))
|
|
(moe-load-theme 'light)
|
|
(moe-load-theme 'dark))
|
|
nil))
|
|
|
|
;; (Thanks for letoh!)
|
|
;; Fix strange bahavior of sunrise-sunset when buffer's width is too narrow.
|
|
(defun get-sunrise-sunset-string ()
|
|
"get the real result from `sunrise-sunset'"
|
|
(save-window-excursion
|
|
(let ((regex "[0-9]+:[0-9]+[ap]m")
|
|
(s (sunrise-sunset))
|
|
(buf (get-buffer "*temp*")))
|
|
(unless (and (stringp s)
|
|
(string-match-p regex s))
|
|
(when buf
|
|
(with-current-buffer buf
|
|
(let* ((s1 (buffer-string))
|
|
(s2 (if (string-match-p regex s1)
|
|
s1 nil)))
|
|
(setq s s2)
|
|
(kill-buffer buf)))))
|
|
s)))
|
|
|
|
;; Convert am/pm to 24hr and save to 24h/sunrise & 24h/set
|
|
;; Excute every 24 hr
|
|
(defun convert-time-format-of-sunrise-and-sunset ()
|
|
(let (rise_set a b c d e f)
|
|
(setq rise_set (get-sunrise-sunset-string))
|
|
(if (string-match "0:00 hours daylight" rise_set) ;If polar-night
|
|
(progn
|
|
(setq 24h/sunrise 'polar-night
|
|
24h/sunset 'polar-night))
|
|
(if (string-match "24:00 hours daylight" rise_set) ;If midnight-sun
|
|
(progn
|
|
(setq 24h/sunrise 'midnight-sun
|
|
24h/sunset 'midnight-sun))
|
|
(progn ;Convert 12hr to 24hr
|
|
(string-match "\\([0-9][0-9]?\\):\\([0-9][0-9]\\)\\([ap]m\\).+\\([0-9][0-9]?\\):\\([0-9][0-9]\\)\\([ap]m\\)" rise_set)
|
|
(setq a (string-to-number (match-string 1 rise_set))
|
|
b (string-to-number (match-string 2 rise_set))
|
|
c (match-string 3 rise_set)
|
|
d (string-to-number (match-string 4 rise_set))
|
|
e (string-to-number (match-string 5 rise_set))
|
|
f (match-string 6 rise_set))
|
|
(if (equal c "pm")
|
|
(setq 24h/sunrise (list (+ 12 a) b))
|
|
(setq 24h/sunrise (list a b)))
|
|
(if (equal f "pm")
|
|
(setq 24h/sunset (list (+ 12 d) e))
|
|
(setq 24h/sunset (list d e))))))))
|
|
|
|
;; Excute every minute.
|
|
(defun switch-by-locale ()
|
|
(if (equal 24h/sunrise 'polar-night) ;If polar-night...moe-dark!
|
|
(moe-load-theme 'dark)
|
|
(if (equal 24h/sunrise 'midnight-sun) ;If midnight-sun...moe-light!
|
|
(moe-load-theme 'light)
|
|
(progn
|
|
(let ((now (list (string-to-number (format-time-string "%H"))
|
|
(string-to-number (format-time-string "%M")))))
|
|
(if (and (or ;magic-logic [tm]
|
|
(> (car now) (car 24h/sunrise))
|
|
(and
|
|
(= (car now) (car 24h/sunrise))
|
|
(>= (second now) (second 24h/sunrise))))
|
|
(or
|
|
(< (car now) (car 24h/sunset))
|
|
(and
|
|
(= (car now) (car 24h/sunset))
|
|
(< (second now) (second 24h/sunset)))))
|
|
(moe-load-theme 'light)
|
|
(moe-load-theme 'dark)
|
|
))))))
|
|
|
|
(defun moe-theme-auto-switch ()
|
|
"Automatically switch between dark and light moe-theme."
|
|
(interactive)
|
|
(if (boundp '24h/sunrise)
|
|
(switch-by-locale)
|
|
(switch-at-fixed-time))
|
|
)
|
|
|
|
(if (and
|
|
(boundp 'calendar-longitude)
|
|
(boundp 'calendar-latitude)
|
|
(eql moe-theme-switch-by-sunrise-and-sunset t))
|
|
(progn
|
|
(convert-time-format-of-sunrise-and-sunset)
|
|
(run-with-timer 0 (* 60 60 24) 'convert-time-format-of-sunrise-and-sunset))
|
|
()
|
|
)
|
|
|
|
(setq moe-timer (run-with-timer 0 (* 1 60) 'moe-theme-auto-switch))
|
|
|
|
;; [FIXME] A minor-mode to enable/disable moe-theme-switcher
|
|
(defun moe-theme-switcher-disable ()
|
|
(interactive)
|
|
(cancel-timer moe-timer))
|
|
|
|
(moe-theme-auto-switch)
|
|
|
|
(provide 'moe-theme-switcher)
|