editor.tokencolorcustomizations 是唯一能修改代码文字颜色的配置项,必须结合 textmaterules 和精确的 token scope(如 keyword.control.python)来定制 keyword/string/comment 等语法元素颜色,且需通过 developer: inspect editor tokens 获取真实 scope,避免泛化 scope 或主题覆盖导致失效。

editor.tokenColorCustomizations 是唯一能改代码文字颜色的配置项,不是换主题、不是改 CSS、也不是调 workbench.colorCustomizations —— 那些只管界面,不管 if、"hello"、// 这些字的颜色。
怎么改 keyword / string / comment 的颜色
必须用 textMateRules + 真实 token scope,不能靠猜:
- 把光标停在目标代码上(比如一个
function关键字),按Ctrl+Shift+P(macOS 是Cmd+Shift+P),运行Developer: Inspect Editor Tokens and Scopes - 看右上角弹出的 scope 列表,例如
keyword.control.js或string.quoted.double.ts—— 这才是你要填进scope字段的值 - 在
settings.json里写规则,例如只改 Python 的def颜色:{ "[python]": { "editor.tokenColorCustomizations": { "textMateRules": [ { "scope": "keyword.control.python", "settings": { "foreground": "#FF6B6B" } } ] } } } - 别写
"keyword"这种泛化 scope:它会同时影响 JS/TS/Python,颜色打架且不可控
为什么改了 settings.json 没变色
90% 是被以下三件事卡住:
-
JSON格式错误:多逗号、引号不闭合、括号错位——VSCode 设置面板右下角虽有红点提示,但容易被忽略;建议粘贴到在线 JSON 验证器里跑一遍 - 当前主题锁死了语法色:像
Nord、One Dark Pro这类第三方主题常在内部设"_defaults": true,直接无视你的textMateRules;先切回官方Default Dark+测试是否生效 - 作用域冲突:两个规则匹配到同一个 token,后写的规则覆盖前一个;用
Inspect Editor Tokens查看右上角显示的 “Rule applied #2”,再调整textMateRules数组顺序
想只改某语言的注释颜色,比如 TypeScript 的 //
通用 comment scope 不行,它会连 HTML 的 <!-- --> 和 Python 的 # 一起改:
- TypeScript 单行注释的真实 scope 是
comment.line.double-slash.ts,不是comment.line - JS 文件要用
comment.line.double-slash.js,TSX 是comment.line.double-slash.tsx,后缀不同,scope 就不同 - 务必在对应语言文件里触发
Inspect Editor Tokens,否则看到的 scope 可能是错的(比如在 .js 文件里查 .ts 的 scope) - 如果语言模式没识别对(右下角显示
Plain Text),Inspect出来的 scope 也无效;先点右下角手动选对语言
别碰 editor.css、不要装“自定义CSS”插件
VSCode 1.80+ 已彻底禁用用户样式注入,所有试图修改 .monaco-editor 或 vs/workbench/workbench.desktop.main.css 的操作都无效:
- 强行编辑构建产物路径,升级后立即丢失,还可能触发
ERR_INVALID_CRX_HEADER启动报错 - 社区里那些“复制粘贴 CSS 覆盖”的教程,基本都过期失效;它们依赖旧版 Electron 渲染机制,现在不走那条链路
- 所谓“CSS 注入插件”,本质是 hack 渲染进程,不稳定、不兼容、重启即失效,且新版 VSCode 会主动拦截
- 真正可控、可维护、升级不丢的路径只有两条:
workbench.colorCustomizations(UI 元素)和editor.tokenColorCustomizations(代码文字)
真正难的不是写几行 JSON,而是确认 scope 是否精准、语言上下文是否匹配、有没有被更高优先级的主题规则静默覆盖。哪怕只改一个 string 的颜色,也得先停在字符串上,敲出 Inspect Editor Tokens,再抄 scope —— 少这一步,后面全白忙。











