vscode自定义主题必须同时包含tokencolors和colors两个顶层字段,缺一则静默忽略;colors用预定义color id控制ui,tokencolors用textmate scope控制语法高亮,且需通过developer: inspect editor tokens and scopes精准获取scope,themes/目录须手动创建、路径为./themes/name.json(全小写连字符),package.json中uitheme仅支持"vs-dark"或"vs"。

VSCode 自定义颜色样式插件(如主题、语法高亮增强类)不是靠改 CSS 或覆盖 DOM 实现的,直接硬写 editor.css 或注入样式在 1.80+ 版本已彻底失效,重启即丢,且会被安全策略拦截。
主题插件必须包含 tokenColors 和 colors 两个顶层字段
只配 colors(UI 控件色)或只配 tokenColors(语法高亮),VSCode 会静默忽略整个主题文件。常见报错 Extension 'xxx' has no themes 多半是这个原因。
-
colors是纯对象,键必须是 VSCode 预定义 color ID,例如editor.background、activityBar.foreground,不能自创 key -
tokenColors是数组,每项含scope(TextMate 作用域)和settings(foreground、background、fontStyle),不支持"bold italic"这种组合值 - 透明度必须用
#RRGGBBAA格式,写成#ff000080可行,rgba(255,0,0,0.5)无效
scope 必须用 Developer: Inspect Editor Tokens and Scopes 实时抓取
靠文档猜、靠经验写 keyword 或 string 往往不生效——不同语言插件注册的 scope 完全不同,JavaScript 的 support.function.console.js 和 Python 的 support.function.builtin.python 互不匹配。
- 光标停在目标代码上(比如一个
console.log()中的log),执行命令后看面板顶部第一个 scope,它最具体、优先级最高 - scope 匹配是“最长前缀匹配”,所以
variable.other.readwrite.ts会覆盖variable,但不会影响entity.name.function - 别在
textMateRules里滥用通配符如"*"或"identifier",大型文件中会拖慢渲染
themes/ 目录路径与文件名有硬性约束
VSCode 不会自动创建 themes/ 文件夹,也不接受嵌套路径或非法命名——漏建、放错位置、名字带空格/大写/中文,都会导致主题不显示。
- 路径必须为扩展根目录下的
./themes/your-theme-name.json(全小写 + 连字符,如dark-sage.json) -
package.json中contributes.themes的uiTheme字段只能是"vs-dark"或"vs",设成"light"或留空会加载失败 - 如果用了 TypeScript 编写主题逻辑,最终仍需把编译后的 JSON 手动放进
themes/,源文件无效
真正难的不是写配置,而是确认 scope 是否精准、是否被第三方主题覆盖、以及 tokenColors 和 semanticTokenColors 的叠加顺序——后者依赖语言服务器,且默认在 Python/Go 等语言中不启用,容易误以为配置没生效。











