在 settings.json 中通过 "editor.tokenColorCustomizations"(词法)或 "editor.semanticTokenColorCustomizations"(语义,需启用 "editor.semanticHighlighting": true)覆盖语法高亮颜色,优先级语义高于词法;须用真实 token 类型(如 "strings" 而非 "string"),推荐用 Developer: Inspect Editor Tokens and Scopes 查看准确 scope;注意 languageOverrides 语法及颜色值格式(#rrggbb)。

如何在 settings.json 中覆盖默认语法高亮颜色
VSCode 的语法高亮不是靠 CSS 文件控制,而是通过 "editor.tokenColorCustomizations" 或 "editor.semanticTokenColorCustomizations" 在 settings.json 中声明式覆盖。直接改主题源码或硬编码 CSS 会失效,且重启后丢失。
-
"editor.tokenColorCustomizations"控制基础词法高亮(如关键字、字符串、注释) -
"editor.semanticTokenColorCustomizations"控制语义高亮(如变量名、函数调用、类型引用),需语言服务器支持且启用"editor.semanticHighlighting": true - 两者可共存,但语义高亮优先级更高;若同时配置了同一 token,语义规则会覆盖词法规则
修改字符串颜色的典型写法与常见错误
很多人以为改 "string" 就能统一所有字符串,但实际上不同语言的字符串 token 类型可能更细粒度,比如 TypeScript 中模板字符串插值部分是 "string.interpolated",而 Python 的 raw 字符串可能是 "string.quoted.raw"。
- 最稳妥的方式是先打开命令面板(
Ctrl+Shift+P),运行Developer: Inspect Editor Tokens and Scopes,把光标停在目标文本上查看真实 token 类型 - 基础字符串通用写法:
"editor.tokenColorCustomizations": { "strings": "#ff6b6b" }—— 注意这里用的是"strings"(复数),不是"string" - 若要精确控制某语言,可用
"languageOverrides":"editor.tokenColorCustomizations": { "languageOverrides": { "typescript": { "strings": "#e74c3c", "comments": "#95a5a6" } } }
为什么改了 settings.json 没生效?几个关键检查点
改完保存却没看到颜色变化,大概率不是配置错,而是被其他层覆盖或条件未满足。
- 确认没有安装冲突的主题扩展(比如 Material Theme、One Dark Pro),它们常自带高亮覆盖逻辑,会无视你的
tokenColorCustomizations - 检查当前工作区是否启用了
settings.json的 workspace 版本(路径为.vscode/settings.json),它会优先于用户级设置,容易误以为“改了没用” - 语义高亮必须满足两个前提:
"editor.semanticHighlighting": true(默认开启),且对应语言的扩展(如 Python、TypeScript)已提供 semantic tokens 支持;否则semanticTokenColorCustomizations完全不触发 - 颜色值必须是合法十六进制(
#rrggbb或#rgb),不支持rgb()、命名色(如red)或透明度写法(#rrggbbaa在部分旧版中不可靠)
自定义注释颜色时要注意作用域嵌套
注释高亮容易出问题,因为很多语言支持嵌套注释(如 C++ 的 /* ... /* nested */ ... */)或行内注释(如 Python 的 # comment 后接代码),不同 token scope 表示不同层级。
- 简单粗暴改所有注释:
"comments": "#7f8c8d"
- 但若想只改块注释(
/* */),得查实际 scope:通常是"comment.block";行注释则是"comment.line" - 某些语言(如 Rust)还有文档注释(
///或/** */),对应 scope 是"comment.documentation",单独配置才生效 - 如果用了
languageOverrides,记得 scope 名称也按语言规范来,例如 JavaScript 中块注释是"comment.block.js",而非通用名
语义高亮的 token 类型比词法多得多,而且随语言扩展版本更新可能变动;真要精细控制,别跳过 Inspect Editor Tokens and Scopes 这一步——光靠猜 scope 名字,十次有八次白改。


















