问题
我们在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)))))
这样我们就完成了代码的编写。
待办
- 根据时间自动调整主题