一直想要這樣一個功能:根據所在地當天的日出日落時間切換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,將而重新設置當前主題。這樣可以在需要根據場景手動切換主題時,能利用同一個函數。
有更好的思路或代碼改進方案,還請留言,謝謝!