之前一直是使用 theme-changer 来根据日出日落时间自动切换 emacs 的主题的。但是有一个问题,因为 macOS 并不是完全按照计算出的日出日落时间去切换 light/dark 模式的,因此 emacs 的主题切换时间与 macOS 系统不同步。

我自己试了增加一个延时参数去尽量与系统切换时间保持接近,但几个月下来发现完全找不到一个相对合适的延迟时间, macOS 并不是固定给日出日落时间加一个延时,具体是什么逻辑到现在还没摸索出来。

如果能够读取 macOS 当前的 light/dark 模式就好了,这样就可以读取到的这个值自动切换主题了。

去 github 搜索了一下,竟然真的有人写了一个包,就是这个 https://github.com/LionyxML/auto-dark-emacs 。试用了一下,发现切换起来有问题,不能做到完全切换,还会遗留一些地方没切换成。于是我 fork 了一份,并进行了如下修改:

  • 修复了切换过程中的 bug ;
  • 增加了可以设置为从主题列表中随机切换的功能,跟我以前的习惯一致;
  • 优化了执行逻辑,大量减少循环次数,提升性能。

我 fork 的仓库地址在 https://github.com/cnsunyour/auto-dark-emacsuse-package 调用方法如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
(use-package auto-dark-emacs
  :straight (auto-dark-emacs
             :type git
             :host github
             :repo "cnsunyour/auto-dark-emacs")
  :when (eq system-type 'darwin)
  :custom
  (auto-dark-emacs/light-theme +list-light-themes)
  (auto-dark-emacs/dark-theme  +list-dark-themes)
  :config
  'auto-dark-emacs/check-and-set-dark-mode)

我用的是 doom-emacs ,调用方法如下:

1
2
3
4
5
6
;; packages.el
(when IS-MAC
  (package! auto-dark-emacs
    :recipe (:host github
             :repo "LionyxML/auto-dark-emacs"
             :fork "cnsunyour/auto-dark-emacs")))
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
;; config.el
(use-package! auto-dark-emacs
  :when IS-MAC
  :custom
  (auto-dark-emacs/light-theme +list-light-themes)
  (auto-dark-emacs/dark-theme  +list-dark-themes)
  :config
  (add-hook! doom-load-theme :append
    (when (and (featurep 'solaire-mode)
               (not (string-prefix-p "doom-" (symbol-name doom-theme))))
      (set-face-background 'solaire-hl-line-face nil)
      (set-face-background 'solaire-default-face nil)))
  (add-hook! after-init #'auto-dark-emacs/check-and-set-dark-mode))