VS Code主题JSON文件位于已安装扩展的themes/目录下,如Windows/Linux在~/.vscode/extensions/xxx-theme/themexxx-color-theme.json,macOS在~/Library/Application Support/Code/Extensions/对应路径;切勿修改内置主题,应复制后重命名并注册为新主题。

主题 JSON 文件在哪找?别乱改默认主题
VSCode 的颜色主题定义在 colorTheme 类型的 JSON 文件里,路径不是随便猜的。Windows 和 Linux 用户去 ~/.vscode/extensions/ 下找已安装主题扩展的文件夹(比如 dracula-theme.theme-dracula-2.27.0),里面 themes/xxx-color-theme.json 才是真身;macOS 路径类似但用户目录是 ~/Library/Application Support/Code/Extensions/。千万别直接改内置主题(如 Default Dark+)——它被硬编码进 VSCode 二进制里,你改了也加载不上。
正确做法是:复制一份你喜欢的主题 JSON,重命名(比如 my-dracula.json),再用 vscode:extension 命令注册为新主题,或放进自己新建的简单主题扩展里。
textMateRules 怎么配才不覆盖语法高亮?
textMateRules 是主题里最常动、也最容易翻车的部分。它靠 scope 匹配语法节点(如 keyword、string.quoted.double.js),但 scope 层级深、嵌套多,盲目加规则会把原本正常的颜色盖掉。比如只写 "scope": "string",可能同时命中 JS 字符串、CSS URL、正则字面量,结果全变红——但你只想改 JS 字符串。
- 先用
Developer: Inspect Editor Tokens and Scopes命令(Ctrl+Shift+P / Cmd+Shift+P),点一下目标代码,看右下角弹出的真实 scope 链 - 优先用更具体的 scope,比如
"string.quoted.double.js"而非"string" - 避免无条件覆盖
foreground:有些语言插件依赖特定色值做语义识别(比如 Prettier 看颜色判断是否字符串模板),乱设会干扰格式化行为 -
settings里"fontStyle": "italic"可以叠加,但"foreground"是硬覆盖,慎用
editor.tokenColorCustomizations 和 editor.semanticTokenColorCustomizations 有啥区别?
前者管传统 TextMate scope 颜色(所有语言通用基础层),后者管语义高亮(Semantic Highlighting),需要语言服务器支持(如 TypeScript、Python Pylance)。两者不互斥,但优先级不同:语义规则 > textMateRules > tokenColorCustomizations。
常见误区是以为关掉 "semanticHighlighting": true 就不用管后者——其实只要插件发了语义 token,VSCode 就会尝试匹配 semanticTokenColorCustomizations。比如你想让 TS 的 interface 名称变蓝,但只在 tokenColorCustomizations 里配了 "keyword",那根本不起作用,得去 semanticTokenColorCustomizations.rules 加 "interface.name"。
语义 token scope 名由语言插件定义,查法:打开一个 TS 文件 → 运行 Developer: Toggle Developer Tools → 控制台输 monaco.editor.getSemanticTokensAtPosition(editor, editor.getPosition()),看返回的 type 字段。
改完不生效?检查这三件事
改完 JSON 保存后没变化,大概率卡在这三个地方:
- 没重启窗口:VSCode 不自动热重载主题 JSON,必须
Developer: Reload Window或关掉重开 - 主题没激活:确认设置里
"workbench.colorTheme"指向的是你刚改的那个文件名(不是扩展名,也不是旧缓存名) - scope 写错或拼写大小写敏感:
"comment"和"comments"是两码事;"support.type.go"里go小写,写成Go就不匹配
真正难调的永远不是“怎么写”,而是“为什么这个 scope 没命中”——多用 Inspect 工具,少凭感觉猜。


















