Klimi's new dotfiles with stow.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

145 lines
5.1 KiB

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