vscode自定义主题必须严格匹配官方color id和textmate scope:colors字段仅接受预定义id(如sidebar.background)、tokencolors依赖精准scope(如support.function.console.js)、uitheme只能是vs-dark/vs/hc-black,路径需相对package.json,workbench.colorcustomizations不支持语法高亮。

VSCode 自定义主题不能靠猜,必须查准 color ID 和 TextMate scope —— 两者缺一不可,且命名、格式、作用域匹配规则全都不容出错。
colors 字段只认预定义 color ID,不支持自创键名
想改侧边栏背景?不能写 sidebar.background 或 sideBarBg,必须用 VSCode 官方定义的 sideBar.background。写错一个字母、多一个空格、大小写不对,整个 key 就被静默忽略。
- 查完整列表最稳的方式:命令面板 →
Developer: Generate Color Theme From Current Settings,它导出的 JSON 就是合法 color ID 的真实集合 -
editor.background控制编辑区底色,editor.foreground控制默认文字色,但它们**完全不影响**语法高亮(那是tokenColors管的) - 像
activityBar.foreground这类 ID,点开命令面板搜 “activity bar” 才能快速定位,别依赖记忆或文档拼写 - 所有 color ID 值必须是字符串,支持
#RRGGBB或带透明度的#RRGGBBAA;写成rgb(64, 64, 64)或var(--my-color)会失效
tokenColors 是数组,scope 匹配靠前缀最长优先
想让 console.log() 中的 log 变红,得配 support.function.console.js,而不是笼统的 support.function —— 后者会把 Python 的 print、Rust 的 println! 全拖下水。
- 精准获取 scope:光标停在目标词上 →
Developer: Inspect Editor Tokens and Scopes→ 看顶部第一个 scope(最具体),复制它 - scope 是层级结构,比如
entity.name.function.ts会覆盖entity.name.function,但不会影响keyword -
tokenColors每项必须含scope和settings,settings里foreground和background接受#RRGGBBAA,fontStyle只能是"italic"、"bold"、"underline"或""(空字符串),不能写"bold italic" - JavaScript 和 TypeScript 的 scope 不同,哪怕同一函数名;不要跨语言复用 scope 字符串
package.json 里 uiTheme 必须为 vs-dark 或 vs
新建主题时,如果 package.json 的 uiTheme 写成 "dark"、"my-dark" 或留空,VSCode 直接拒载主题,连错误提示都没有。
- 合法值只有三个:
"vs-dark"(深色 UI)、"vs"(浅色 UI)、"hc-black"(高对比度) - 这个字段决定主题能否被识别为“界面主题”,和
tokenColors是否生效无关,但它控制整个 UI 框架的底层渲染模式 - 如果你的主题看起来“UI 颜色对了但编辑器一片白”,大概率是
uiTheme值非法,导致 VSCode 根本没加载你的colors配置 - 路径字段
path必须相对于package.json,比如"./themes/my-theme.json",不能写绝对路径或带~/
workbench.colorCustomizations 是快捷方式,不是替代方案
在 settings.json 里写 workbench.colorCustomizations 能快速调 UI 色,但它**无法控制语法高亮**,也不支持 tokenColors 的 scope 精细匹配。
- 它适合临时调试或单点微调(比如只想换个状态栏颜色),但长期维护建议走完整主题 JSON 流程
- 它的优先级低于已启用的 color theme,也就是说:你启用了自定义主题 A,又在
settings.json里写了workbench.colorCustomizations,后者会被主题 A 覆盖 —— 除非你在主题 A 的colors里显式留空或设为null - 它不支持透明度语法(如
#00000080)在部分老版本中会回退为不透明,而完整主题 JSON 支持稳定解析#RRGGBBAA - 别指望它能解决括号着色、变量名区分这类问题 —— 那些必须进
tokenColors配 scope
真正卡住人的从来不是“怎么写”,而是“为什么没反应”:color ID 拼错、scope 太宽泛、uiTheme 值非法、透明度格式不对、路径相对位置错了……这些地方 VSCode 一律不报错,只沉默跳过。调试时盯住 Developer 工具输出和生成的 theme JSON 原始结构,比反复重启有效得多。











