直接改settings.json里的editor.tokenColorCustomizations即可生效,需用Developer: Inspect Editor Tokens and Scopes精准获取scope(如string.quoted.double.js),配置textMateRules数组,scope须具体且匹配,foreground等设置格式正确,避免与workbench.colorCustomizations混淆。

直接改 settings.json 里的 editor.tokenColorCustomizations,别碰主题文件,也别往 workbench.colorCustomizations 里塞语法相关配置——那根本不起作用。
怎么写 textMateRules 才生效
VS Code 的语法高亮靠 TextMate scope 匹配,不是靠猜。你写的每条规则都必须包含 scope 和 settings,且 scope 要真实存在、足够具体。
- 用
Developer: Inspect Editor Tokens and Scopes命令(Ctrl+Shift+P 输入)查看光标所在位置的实际作用域,比如keyword.control.if.python或string.quoted.double.js - 优先选最具体的 scope,比如
keyword.control.return.ts比keyword更可靠,避免误染其他语言的关键字 -
settings中只认foreground、background、fontStyle(值为"italic"、"bold"或"bold italic"),不支持fontSize或border - 多条规则可能冲突,VS Code 按 scope 字符串长度做最长前缀匹配,所以
variable.parameter会覆盖variable
editor.tokenColorCustomizations 放哪、怎么结构
这个配置必须写在用户或工作区的 settings.json 根对象里,不是嵌套在其他字段下。格式固定,不能少括号也不能错层级。
- 路径:打开设置 → 右上角“打开设置(JSON)”图标,或快捷键 Ctrl+Shift+P →
Preferences: Open Settings (JSON) - 正确结构示例:
{
"editor.tokenColorCustomizations": {
"textMateRules": [
{
"scope": "comment",
"settings": {
"foreground": "#6a7d5a",
"fontStyle": "italic"
}
},
{
"scope": ["string", "string.quoted.double"],
"settings": {
"foreground": "#d6994b"
}
}
]
}
}
- 注意:
scope可以是字符串或字符串数组,但不能是正则或通配符;textMateRules是数组,每条规则必须是独立对象 - 改完保存,无需重启,当前编辑器立即刷新(Remote-SSH 场景请确认改的是远程窗口的 settings.json)
为什么改了没反应?常见失效原因
不是配置写错,就是被更高优先级的东西盖住了。VS Code 的颜色渲染有明确叠加顺序,搞错位置就白忙。
- 语言模式识别错误:右下角显示 “Plain Text” 就别指望
keyword生效,先点它手动选成JavaScript或对应语言 - 第三方主题硬编码覆盖:比如 Nord、One Dark Pro 在
tokenColors里直接写了variable颜色,你的textMateRules会被压制;临时切到Default Dark+验证是否主题冲突 - 误用
workbench.colorCustomizations:这个只管 UI(侧边栏、状态栏),对代码行内语法完全无效,塞进去的keyword配置等于丢进黑洞 - 语义高亮开启后干扰:如果
"editor.semanticHighlighting.enabled": true,部分语言(如 TS/JS)会优先用 LSP 提供的语义 token,此时textMateRules对variable这类通用 scope 可能不触发;可加更细粒度 scope 如variable.other.readwrite或关掉语义高亮测试
函数名、参数、局部变量想单独调色怎么办
基础语法 scope(如 function、variable)太宽泛,容易误伤。真要区分语义,得靠两层配合:语言服务器 + 更细粒度 scope。
- 先确保对应语言扩展已安装并启用语义高亮(如 TypeScript 官方插件、Python Pylance)
- 运行
Developer: Inspect Editor Tokens and Scopes,把光标停在函数名上,看有没有entity.name.function或support.function.builtin这类 scope - 局部变量常见 scope:
variable.other.readwrite(TS/JS)、variable.parameter(函数参数)、variable.language.this - 注意:不是所有语言都提供完整语义 token,Python 的局部变量目前仍主要依赖
variable,而 Rust、Go 支持较好 - 背景色(
background)在部分语言中渲染不稳定,优先用foreground+fontStyle组合达成视觉区分
真正难的不是写几行 JSON,而是每次修改前先用 Inspect 工具确认 scope 是否真实存在、是否被语义高亮接管、是否被主题硬编码拦截——跳过这步,90% 的“没反应”都能避免。


















