Windows中Emacs根据系统的亮暗模式来选择主题

4,546 阅读1分钟

问题

我们在Windows中启动Emacs的时候,也希望Emacs的主题能够跟随系统的亮色或暗色模式来选择,这样可以使我们的主题不至于对眼睛不友好。

解决

一种可能的思路是先获取当前系统的模式,然后根据获取的结果来选择不同的主题。废话少说,上代码。

我们可以通过下面的代码获取当前系统的模式(适用于Win 10/11):

"powershell (Get-ItemProperty -Path HKCU:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize -Name AppsUseLightTheme).AppsUseLightTheme"

然后如果是亮色,会返回1,暗色返回0。我们就可以在Emacs中调用这个命令获取到结果:

(let* ((cmd "powershell (Get-ItemProperty -Path HKCU:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize -Name AppsUseLightTheme).AppsUseLightTheme")
       (mode (string-trim (shell-command-to-string cmd)))))

为了后面直接使用,我们上面使用了let*来包装。

然后就可以来判断了:

(let* ((cmd "powershell (Get-ItemProperty -Path HKCU:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize -Name AppsUseLightTheme).AppsUseLightTheme")
       (mode (string-trim (shell-command-to-string cmd))))
    (if (equal mode "1")
          (load-theme 'modus-operandi t)
        (load-theme 'modus-vivendi t)))

将这段代码放到合适的位置(例如init.el中),就能够起到作用。但由于这段代码只在Windows系统上起作用,所以我们最后在加上系统的判断:

(when (memq system-type '(ms-dos windows-nt cygwin))
    (let* ((cmd "powershell (Get-ItemProperty -Path HKCU:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize -Name AppsUseLightTheme).AppsUseLightTheme")
           (mode (string-trim (shell-command-to-string cmd))))
      (if (equal mode "1")
          (load-theme 'modus-operandi t)
        (load-theme 'modus-vivendi t)))))

这样我们就完成了代码的编写。

待办

  • 根据时间自动调整主题