editor.tokencolorcustomizations 必须写在 settings.json 顶层,使用 textmaterules 配置合法 scope(如 comment.line.double-slash),避免用无效简写(如 comments);语言专属配置需用 [language-id] 格式,且语义高亮可能覆盖该设置。

editor.tokenColorCustomizations 配置写在 settings.json 里就能立刻生效,不用重启、不依赖主题插件、也不用动 theme 文件——但多数人配完没反应,是因为 scope 写错了、格式不对,或者被语义高亮悄悄覆盖了。
为什么改了 comments 没变色?
你写的 "comments": "#666" 看似合理,但 VSCode 不认这个 key。它只识别标准 TextMate scope 字符串(比如 comment.line.double-slash)或预定义的简写名(如 strings、keywords),且大小写和复数形式必须严格匹配。
-
comments❌(无效,不是合法简写) -
comment✅(基础注释通用匹配) -
comment.line.double-slash✅(精准匹配//行注释) -
comment.block✅(匹配/* */块注释)
更关键的是:这些简写只在 textMateRules 数组里才被支持;如果直接写成扁平键值对(如 "comment": "#999"),VSCode 会静默忽略。
editor.tokenColorCustomizations 正确写法
必须是对象结构,顶层字段不能嵌套错位置。常见错误是把它塞进 workbench.colorCustomizations 或丢到 package.json 里。
- 打开命令面板 →
Preferences: Open Settings (JSON) - 在顶层 JSON 对象里添加
"editor.tokenColorCustomizations"字段 - 推荐用
textMateRules写法,可控性强、兼容性好
示例(让 JS 的 // 注释变青色):
"editor.tokenColorCustomizations": {
"textMateRules": [
{
"scope": "comment.line.double-slash",
"settings": {
"foreground": "#00c8a0"
}
}
]
}
注意:scope 是字符串或字符串数组,settings.foreground 必须是 #rrggbb 或 #rrggbbaa 格式,不支持 rgb() 或命名色。
语言专属颜色怎么配?
不同语言的注释、字符串、关键字可能对应不同 scope,硬套一个规则容易失效。VSCode 支持按语言覆盖,语法是 "[language-id]" 键名。
- language-id 查法:打开对应文件 → 命令面板 →
Developer: Inspect Editor Tokens and Scopes→ 看左下角 “Language ID” - C 语言是
c,Python 是python,TypeScript 是typescript - 不要写成
[C]或[Python],大小写和中括号缺一不可
示例(只改 Python 注释颜色,不影响其他语言):
"editor.tokenColorCustomizations": {
"[python]": {
"textMateRules": [
{
"scope": "comment.line.number-sign",
"settings": {
"foreground": "#ff6b6b"
}
}
]
}
}
为什么改完还是被主题盖过去了?
有两个隐藏优先级机制在起作用:
-
editor.semanticTokenColorCustomizations优先级高于editor.tokenColorCustomizations,哪怕你没显式配置,某些主题(如 One Dark Pro)或启用editor.semanticHighlighting后,语义规则会自动接管 - 第三方主题若在自己的
tokenColors里写了更具体的 scope(比如support.function.console.js),你的泛化规则(如support.function)就会被绕过
验证方法:光标停在目标代码上 → 运行 Developer: Inspect Editor Tokens and Scopes → 看 “Currently applied rules” 列表里哪条生效了,就去覆盖那条的 scope。
真正难的不是写 JSON,而是确认当前 token 被哪个 scope 匹配、又被哪条规则最终渲染——这点漏掉,所有配置都白搭。











