vscode语义高亮需先启用editor.semantichighlighting并确保语言服务器(如pylance、ts server)和主题支持,再通过editor.semantictokencolorcustomizations精准着色函数、参数等语义元素,辅以textmaterules补全注释、正则等非语义场景。

VSCode 默认的语法高亮足够基础,但想真正“突出关键代码逻辑”,光靠换主题远远不够——必须分层干预:先确保语义高亮启用并生效,再用 editor.semanticTokenColorCustomizations 精准着色函数、参数、类等角色,最后用 editor.tokenColorCustomizations 补漏(比如注释里的 TODO)。直接改 workbench.colorCustomizations 或硬塞 CSS 是无效的。
怎么确认语义高亮已真正起作用
很多人开了 "editor.semanticHighlighting": true 就以为万事大吉,但实际可能根本没触发。原因很现实:
- 当前主题不支持语义 token(比如很多第三方主题的
package.json里没声明semanticTokenColors字段) - 语言服务器没响应(如 Python 没装 Pylance,TypeScript 项目没
tsconfig.json) - 文件语言模式错误(右下角显示的是
Plain Text而非JavaScript或Vue)
验证方法很简单:临时切到官方 Dark+ (default dark) 主题,打开一个含 function foo() {} 和 const bar = new Foo(); 的文件,看 foo(函数名)和 Foo(类名)是否颜色不同。如果一样,说明语义层没通。
配置 editor.semanticTokenColorCustomizations 的实操要点
这是突出逻辑的核心手段,它让 function、parameter、class 这些语义类型拥有专属颜色,而不是笼统地套在 keyword 下。
- 必须显式开启:
"editor.semanticHighlighting": true(加在 settings.json 顶层) - 规则写在
"editor.semanticTokenColorCustomizations"下,不是tokenColorCustomizations - 键名必须是标准语义类型,比如
"function"、"parameter"、"type",不能写成"func"或"arg" - 支持修饰符通配,例如
"parameter.declaration"只匹配参数声明处,"*.declaration"匹配所有声明场景 - 值可以是纯颜色字符串(
"#98c379"),也可以是对象({"foreground": "#abb2bf", "italic": true})
示例(只改函数和参数):
"editor.semanticTokenColorCustomizations": {
"rules": {
"function": "#61afef",
"parameter": {"foreground": "#56b6c2", "italic": true},
"parameter.declaration": {"foreground": "#e06c75", "bold": true}
}
}
为什么 textMateRules 还得留着
语义高亮虽强,但覆盖不了全部场景。比如:
- 注释里的
// TODO: fix this—— 语义层不识别注释内容,得靠textMateRules配comment+ 正则匹配 - 正则字面量
/\d+/g中的\d—— 多数语言服务器不提供其语义类型,只能用 TextMate scope 如string.regexp.character-class - 某些老旧语言(如 Shell、INI)压根没语义支持,全靠 TextMate 规则撑着
查 scope 的唯一可靠方式是:按 Ctrl+Shift+P → 输入 Developer: Inspect Editor Tokens and Scopes,把光标停在目标词上,看弹窗里显示的 textMateScope 和 semanticToken 分别是什么。别猜,也别复制别人博客里的 scope —— 同一语言不同插件(Volar vs Vetur)、不同版本,scope 可能完全不同。
容易被忽略的冲突点:主题覆盖与优先级
你配好了所有规则,但颜色还是不对?大概率是被覆盖了:
-
editor.semanticTokenColorCustomizations优先级 >editor.tokenColorCustomizations,所以别在两个地方配同一个 token(比如都配function) - 第三方主题(如 One Dark Pro)自带的语义规则会参与叠加,如果你没禁用它,自己的配置可能只是“补丁”而非“主控”
-
workbench.colorCustomizations对代码区域完全无效,它只管侧边栏、状态栏这些 UI 元素 - 某些插件(如 Better Comments)会注入自己的 decoration,它们的颜色可能盖过你的 token 设置
调试时建议:关掉所有插件,切回 Dark+ 主题,清空 settings.json 里除语义高亮外的所有 color 相关字段,逐条加规则验证。复杂点不在配置本身,而在确认哪一层真正生效。











