必须将主题文件置于./themes/midnight-sage.json路径,package.json中contributes.themes[].uiTheme严格设为"vs-dark"或"vs",且colors与tokenColors字段缺一不可,否则主题无法被VSCode识别启用。

直接创建一个能被 VSCode 识别并启用的个人颜色主题,必须同时满足三个硬性条件:主题文件路径正确、package.json 正确声明、colors 和 tokenColors 两个字段缺一不可。只改 settings.json 里的 workbench.colorCustomizations 不算“创建主题”,它只是用户级覆盖,无法导出、复用或分享。
theme 文件必须放在 ./themes/midnight-sage.json 路径
VSCode 不会自动扫描任意 JSON 文件作为主题——它只认固定路径下的文件。你必须手动创建 themes/ 子目录,并把主题文件放在里面:
- 项目根目录下新建文件夹:
themes(不能叫theme、Themes或嵌套在src/里) - 文件名必须全小写、用连字符分隔、以
.json结尾,例如:midnight-sage.json(MidnightSage.json或midnight sage.json都会失败) - 完整路径必须是:
./themes/midnight-sage.json
路径错就根本看不到你的主题。执行 Developer: Inspect Editor Tokens and Scopes 不会报错,但你的主题压根不会出现在「颜色主题」列表里。
package.json 中 contributes.themes[].uiTheme 必须填 vs-dark 或 vs
VSCode 主题不是靠文件名或内容自动判断明暗模式的,而是靠 package.json 中 contributes.themes[].uiTheme 字段强制指定:
-
"uiTheme": "vs-dark"→ 对应深色 UI(比如你设了"editor.background": "#1a1a1a") -
"uiTheme": "vs"→ 对应浅色 UI(不能写vs-light或light,官方不认) - 即使你主题里
colors全是浅色值,只要uiTheme是vs-dark,VSCode 就按深色模式加载;反之亦然 - 常见错误:
"uiTheme": "dark"或"uiTheme": "my-dark"—— 这两种写法都会让主题静默失效
tokenColors 不配,语法高亮永远是默认色
很多人以为改了 "editor.background" 和 "sideBar.background" 就算主题完成了,结果打开代码一看:注释还是灰色、关键字还是蓝色——因为没配 tokenColors。VSCode 的语法着色逻辑优先级是:具体 scope > editor.foreground > 默认 fallback:
-
tokenColors是数组,每一项必须含scope(TextMate 作用域)和settings(含foreground等) - 别猜
scope名字:把光标停在目标代码上(比如一个function关键字),按Cmd+Shift+P→ 运行Developer: Inspect Editor Tokens and Scopes,取顶部第一个scope(如keyword或support.function.cpp) - 对 C/C++ 这类语言,尤其要注意多级指针(
int**** p)、嵌套模板(std::vector<std::string>)等结构的 scope 组合,单配keyword不够
配色科学性比“好看”更重要
C/C++ 开发者长期面对复杂语法结构,眼疲劳风险高。眼科建议代码编辑器对比度控制在 4.5:1 到 7:1 之间,这是最符合人眼生理特性的范围:
- 高对比度(如纯白字+纯黑底)会导致视网膜细胞持续紧张
- 相似语法元素(如
const和volatile修饰符)若用同色,会削弱语义区分 - 背景色与前景色需同步调整:深色主题下,
comment建议用#6a6a6a而非#808080,避免亮度接近editor.foreground - 真正难的不是写 JSON,而是验证每种 scope 在真实代码块中的渲染效果——别只看单个单词,要贴一段带宏、模板、指针运算的典型 C++ 片段去测试



















