确认TextMate scope需运行“Developer: Inspect Editor Tokens and Scopes”,悬停查看完整scope链(如entity.name.function.ts),后缀表明来源语言;若仅显示source或text.plain,说明语言未识别,须先解决文件关联或扩展安装。

直接改 settings.json 里的 editor.tokenColorCustomizations 或 editor.semanticTokenColorCustomizations 就能生效,但前提是 scope 对、语言模式对、语义高亮已启用——三者缺一不可。
怎么确认当前代码用的是哪个 TextMate scope?
这是所有自定义的起点。光看文件后缀或右下角语言名没用,VSCode 实际着色依据是它为每个字符打上的 scope 标签。
- 快捷键
Ctrl+Shift+P(macOS 是Cmd+Shift+P),输入并运行Developer: Inspect Editor Tokens and Scopes - 鼠标悬停在目标词上(比如一个函数名),面板会显示完整 scope 链,例如
entity.name.function.ts或string.quoted.double.json - 注意后缀:
.ts表示该规则来自 TypeScript 语法定义;如果只看到source或text.plain,说明 VSCode 没识别出语言,得先解决文件关联或扩展安装
为什么加了 textMateRules 却没变色?
常见于在 settings.json 里写了 editor.tokenColorCustomizations 却看不到效果,根本原因不是配置错,而是 scope 不匹配或被更高优先级规则覆盖。
- scope 必须精确:想改 TypeScript 类名,写
entity.name.class不够,得用entity.name.class.ts或更细粒度的entity.name.type.class.ts - 不要漏掉语言后缀——不同语言对同一语法结构的 scope 命名不同,
variable.other在 Python 和 JavaScript 中可能对应完全不同的渲染逻辑 - 检查是否被主题内置规则覆盖:有些主题(如 One Dark Pro)在
tokenColors里显式定义了大量 scope,你的textMateRules可能被跳过,此时应改用主题继承方式覆盖
editor.semanticTokenColorCustomizations 怎么配才真正起作用?
语义高亮依赖语言服务器返回 token 类型,不是写了规则就自动生效。它和 TextMate 规则属于两套体系,不打通就会白配。
- 先确保
Editor: Semantic Highlighting设置为enabled(可在设置里搜这个词) - Python 需要 Pylance,TypeScript/JS 默认支持,Go 需要 Go 扩展启用
gopls,否则function、parameter这类语义 token 根本不会发出来 - 规则写法示例:
"function": "#98c379"会统一染所有函数名;"*.declaration": {"bold": true}让所有声明位置加粗;但"parameter.declaration"这种组合写法无效——语义 token 不支持点号嵌套,只认顶层类型 + 修饰符(如parameter,parameter.readonly) - 调试时仍要用
Developer: Inspect Editor Tokens and Scopes,面板里会明确标出Semantic Token: function或Parameter (readonly),这才是你该配的 key
如何让自定义只对某一种语言生效?
全局配色容易污染其他语言,真要“只改 TypeScript 的字符串”,不能靠 scope 猜,得用 language-scoped 配置。
-
editor.tokenColorCustomizations不支持按语言过滤,它只认 scope - 正确做法是:在工作区根目录建
.vscode/settings.json,写入:{ "[typescript]": { "editor.tokenColorCustomizations": { "textMateRules": [ { "scope": "string", "settings": { "foreground": "#2ec4b6" } } ] } } } - 注意格式:
"[typescript]"中的typescript是语言 ID,不是文件后缀,必须和Change Language Mode弹窗里显示的一致(比如javascriptreact而非jsx) - 这种写法优先级高于用户级设置,且不会影响其他语言,适合团队项目统一规范
最常被忽略的一点:改完 settings.json 后,已打开的文件不会自动重绘高亮,必须关闭再重新打开,或者执行 Developer: Reload Window。scope 错、语言 ID 错、语义未启用、文件没重载——这四点占了 90% 的“配了没反应”问题。


















