一直想要这样一个功能:根据所在地当天的日出日落时间切换light或dark风格的主题,同时能在阅读文档或网页等其他场景时,以自己的需要手动切换,今天自己实现了!头一回用elisp实现某个功能,喜大普奔……
具体思路是,输入经纬度后,利用sunrise-sunset
这一自带函数,得到当天的日出日落时间,跟当前时刻比大小。没有找到该函数以24h制表示时间的方法,所以多加了一层判断:
(defvar dark-theme "Hesperus")
(defvar light-theme "Phosphorus")
(defun switch-theme-based-on-solar (mylat mylon)
"Switch themes based on the local times of sunrise and sunset."
(let ((calendar-latitude mylat) (calendar-longitude mylon))
(let ((sunrise-sunset-list (split-string (sunrise-sunset))))
(let ((sunrise-time (split-string (nth 1 sunrise-sunset-list) "[:apm]"))
(sunset-time (split-string (nth 4 sunrise-sunset-list) "[:apm]")))
(let ((sunrise-num (string-to-number (concat (car sunrise-time) (nth 1 sunrise-time))))
(sunset-num (string-to-number (concat (car sunset-time) (nth 1 sunset-time)))))
(if (> (string-to-number (format-time-string "%H")) 12)
(if (> (string-to-number (format-time-string "%I%M")) (+ sunset-num 10))
(setq my-current-theme light-theme)
(setq my-current-theme dark-theme))
(if (> (string-to-number (format-time-string "%H%M")) (- sunrise-num 10))
(setq my-current-theme dark-theme)
(setq my-current-theme light-theme))))))))
(switch-theme-based-on-solar 纬度 经度)
其中switch-theme-based-on-solar()
函数里是纬度和经度的数值,西经的话,要用负值,而且注意经纬度不要填反了。
随后需要加一个切换的函数,其他细节请根据自己的需要、酌量添加,实现切换功能的部分如下:
(cond
((string-equal my-current-theme "Hesperus")
(progn
(disable-theme 'Hesperus)
(load-theme 'Phosphorus t)
(setq my-current-theme "Phosphorus")))
((string-equal my-current-theme "Phosphorus")
(progn
(disable-theme 'Phosphorus)
(load-theme 'Hesperus t)
(setq my-current-theme "Hesperus"))))
即,在上一个函数判断时刻之后,若为白天,则先设置当前主题为dark-theme
,随后disable之、并启用light-theme,将而重新设置当前主题。这样可以在需要根据场景手动切换主题时,能利用同一个函数。
有更好的思路或代码改进方案,还请留言,谢谢!