直接修改 settings.json 顶层的 editor.tokenColorCustomizations,使用 "textMateRules": [] 数组格式,每条规则含精准 scope 和 "settings"(仅支持 foreground/fontStyle/background),并关闭主题语法高亮或语义高亮干扰。

直接改 editor.tokenColorCustomizations 就行,别碰主题包、不用装插件,改完保存即生效。
怎么写才真正生效
VS Code 对配置极其挑剔,写错位置、写错字段名、scope 不精准,它都沉默忽略,不报错也不提醒。
-
editor.tokenColorCustomizations必须是settings.json顶层字段,不能塞进workbench.colorCustomizations里,也不能写在用户界面设置的 JSON 编辑器里 - 必须用
"textMateRules": []数组形式,不是"tokens": []或直接写对象;旧文档里见过的"comments": "#666"这种简写已不推荐,兼容性差且容易被覆盖 - 每条规则必须同时包含
"scope"和"settings",缺一不可;"settings"里只认"foreground"、"fontStyle"(如"italic")、"background",不支持"color"或"textColor"
scope 怎么找才靠谱
靠猜或搜“js 函数颜色”这种关键词基本没用。VS Code 的语法高亮基于 TextMate scope 链,同一个词可能有 3–5 层 scope,宽泛匹配(比如只写 support.function)会被更具体的规则覆盖,或者拖慢渲染。
- 光标停在目标代码上,按
Ctrl+Shift+P(Windows/Linux)或Cmd+Shift+P(macOS),执行Developer: Inspect Editor Tokens and Scopes - 看弹出面板顶部第一个 scope —— 它最具体、优先级最高,例如
support.function.console.js比support.function.js更稳 - 避免用
comment、keyword、identifier这类裸 scope;优先选带语言后缀和上下文的,如comment.line.double-slash.tsx、variable.other.readwrite.ts
为什么改了还是没变
90% 的失效不是配置错,而是被第三方主题静默接管了。One Dark Pro、Nord、Dracula 等主流主题都自带完整的 tokenColors,它们的规则默认优先于你的 editor.tokenColorCustomizations。
- 临时切到 VS Code 自带的
Default Dark+主题测试,如果这时颜色变了,说明就是主题覆盖问题 - 查你装的主题文档,找类似
"nord.enforceSyntaxHighlighting": false或"oneDarkPro.syntaxTheme": "none"的开关,关掉它的语法强化 - 不要指望
workbench.colorCustomizations能影响代码文字颜色——它只管 UI 边框、状态栏、侧边栏背景等非代码区域
容易被忽略的语义层干扰
即使 scope 写对、位置写对、主题也关了,有些代码颜色还是顽固不变。这时候大概率是 editor.semanticTokenColorCustomizations 在起作用——它是 LSP 语言服务器驱动的语义高亮,优先级高于 TextMate 规则。
- 如果你开了 TypeScript/Python/Go 等语言服务器,并启用了
"editor.semanticHighlighting": true(默认开启),那么函数名、参数、类型别名这些会按语义着色,不受textMateRules控制 - 想统一控制,要么关掉语义高亮:
"editor.semanticHighlighting": false,要么改editor.semanticTokenColorCustomizations,但后者需要知道语义 token 名,比如parameter、type、function - 语义规则不会自动 fallback 到 TextMate,也不会合并——它是独立一层,开了就接管,关了才退回到词法高亮


















