cover
2022年4月23日 - 2023年7月31日

VSCode 如何根据系统主题自动更换主题

近期疫情被隔离在家办公,平时在办公室都是电脑暗色主题,但是在家白天不想关窗户,暗色主题没法看清,所以想白天使用亮色主题,晚上切成暗色。然而手动切换太麻烦了,现在操作系统都支持自动切换主题,所以想让 VSCode 也同步进行切换。

autoDetectColorScheme

VSCode 配置中存在一个配置项 window.autoDetectColorScheme

{
    // If set, automatically switch to the preferred color theme based on the OS appearance. If the OS appearance is dark, the theme specified at `workbench.preferredDarkColorTheme` is used, for light `workbench.preferredLightColorTheme`.
    "window.autoDetectColorScheme": false
}

当设置为 true 时,VSCode 将会根据系统主题自动切换主题,如果系统主题是暗色,则会切换到 workbench.preferredDarkColorTheme,如果系统主题是亮色,则会切换到 workbench.preferredLightColorTheme

所以要实现自动切换主题,需要配置中开启 window.autoDetectColorScheme,并为 workbench.preferredDarkColorThemeworkbench.preferredLightColorTheme 设置对应的主题值。

以下是我的配置:

{
    "window.autoDetectColorScheme": true,
    "workbench.preferredDarkColorTheme": "One Dark Pro",
    "workbench.preferredLightColorTheme": "Atom One Light"
}

可以直接修改配置文件,或者 cmd+shift+p 后输入 Open Settings (UI),搜索 autoDetectColorScheme 就可以看到对应的配置项。

picture 2

问题

添加自动切换主题后,系统每次切换主题时,VSCode 会按照配置将 preferredDarkColorThemepreferredLightColorTheme 写入到 colorTheme 来进行主题切换。这就导致,如果你使用了配置同步,几台电脑的 VSCode 都会切换主题写入配置文件,然后进行同步,这会导致后来的写入失败,VSCode 会提示错误并自动打开配置文件。而且这里好像有些 bug,偶尔打开配置文件会失败,而显示一个看不见的未保存文件,只能重启窗口解决。

当然,直接不需要关注配置文件内容关闭即可,无伤大雅,不过项目开的多的时候需要关闭很多个配置文件,需要一个个关闭就比较麻烦了,希望 VSCode 后面能优化一下,不要再写入 colorTheme 直接按照 autoDetectColorScheme 来读取 preferredDarkColorThemepreferredLightColorTheme 做主题就好了。

后续尝试发现是因为 Sundial 插件导致的,不是 VSCode 的锅,😂 可忽略。

插件实现

也可以通过插件来实现自动切换:Sundial – Automatic night mode and settings switch,该插件可以自定义日出日落的时间,然后根据日出日落时间来进行切换,而不依赖于系统主题。