forked from kuanyui/moe-theme.el
-
Notifications
You must be signed in to change notification settings - Fork 0
/
moe-theme-switcher.el
145 lines (127 loc) · 5.13 KB
/
moe-theme-switcher.el
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
;; moe-theme-switcher.el
;; Author: kuanyui ([email protected])
;; 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-int (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)