直接修改 editor.tokencolorcustomizations 即可生效,但常见失效原因是 scope 错误、配置位置不对(须在 settings.json 中)或被第三方主题覆盖;需用 developer: inspect editor tokens and scopes 命令精准定位 scope,优先使用 textmaterules 配置,并注意语义高亮(semantictokencolorcustomizations)的覆盖关系。

直接改 editor.tokenColorCustomizations 就能生效,但多数人配了半天没反应,根本原因是 scope 没抓准、配置位置错了,或被第三方主题悄悄覆盖了。
怎么确认你要改的语法元素对应哪个 scope
别猜、别搜“注释颜色设置”,VS Code 不认这种模糊词。必须用内置命令定位真实 scope:
- 按
Ctrl+Shift+P(Windows/Linux)或Cmd+Shift+P(macOS)打开命令面板 - 输入并执行
Developer: Inspect Editor Tokens and Scopes - 把光标点在目标代码上(比如一个
function关键字、一对[]括号、一段// 注释),面板会立刻显示当前 token 类型、scope 链和已生效的颜色规则
常见 scope 示例:keyword(if、return)、string(双引号内内容)、comment.line.double-slash(// 行注释)、punctuation.bracket([ ] { })。
配置写在哪?格式怎么写才不报错
editor.tokenColorCustomizations 必须写在 settings.json 里,不是 UI 设置界面,也不是主题文件中。路径是用户设置或工作区设置的 JSON 文件。
- 打开命令面板 →
Preferences: Open Settings (JSON) - 在顶层对象里添加
"editor.tokenColorCustomizations"字段,结构为对象,不是数组 - 支持两种写法:扁平键值对(如
"keywords": "#ff4757")或textMateRules精确匹配(推荐) - 使用
textMateRules时,每条规则必须含scope和settings,例如:{ "editor.tokenColorCustomizations": { "textMateRules": [ { "scope": "comment", "settings": { "foreground": "#6c757d" } } ] } } - JSON 格式必须严格合法:引号全用英文双引号,末尾不能多逗号,
scope字符串大小写敏感
为什么改了却没变色?三个最常踩的坑
不是配置无效,而是优先级或作用域被绕过了:
- 第三方主题(如
Nord、One Dark Pro)自带tokenColorCustomizations,会覆盖你写的规则;解决办法是查该主题文档,设"nord.enforceSyntaxHighlighting": false或类似开关禁用其语法层 - 你改的是
workbench.colorCustomizations(管 UI),但想调的是函数名颜色——那是语法高亮,归editor.tokenColorCustomizations管,二者完全隔离 - 用了泛 scope(如
comment)但某些语言(如 Python)实际触发的是更细粒度的comment.line.number-sign,结果只在 JS 里生效;此时要加多条规则,或用 scope 列表:"scope": ["comment", "comment.line"]
要不要开 semanticTokenColorCustomizations
如果你已经启用了语言服务器(绝大多数现代语言都默认开),且想区分「局部变量」和「全局变量」、「类方法」和「普通函数」,那就该用 editor.semanticTokenColorCustomizations。
- 它比
tokenColorCustomizations更底层,依赖语义分析而非纯文本匹配 - 启用后,
textMateRules仍有效,但会被语义规则优先覆盖;所以建议先关掉语义着色("editor.semanticHighlighting": false)调好基础语法色,再开语义层微调 - 典型规则:
"*.static": { "foreground": "#a29bfe" }, "variable.local": { "foreground": "#00cec9" },其中variable.local是语义 token,不是 TextMate scope - 注意:不是所有语言都提供完整语义 token 支持,TypeScript/Python/Go 较全,Shell/C/C++ 可能有限
真正难的从来不是加一行颜色,而是判断哪一层(语法 / 语义 / UI)在起作用、谁在覆盖谁、scope 到底叫什么——Inspect 命令点三下,比翻十篇教程快得多。











