语义高亮默认关闭,需手动开启并确保语言服务器与主题支持;VSCode 1.85+ 中 editor.semanticHighlighting.enabled 默认为 false,开启后还需验证 token 类型是否被正确提供及主题是否映射。

语义高亮默认是关的,得手动开
VSCode 1.85+ 版本起,editor.semanticHighlighting.enabled 默认为 false,不是“自动判断”,也不是“装了插件就生效”。你看到函数名和变量颜色一样、const 和 let 声明的变量没区别,大概率就是这个开关根本没开。
打开设置(Ctrl+, ),搜 semantic highlighting,勾选 Editor: Semantic Highlighting;或者直接在 settings.json 里加一行:
"editor.semanticHighlighting.enabled": true
改完不用重启,但当前文件可能需手动触发重载:右键编辑器 → Developer: Reload Window,或切换标签再切回来。
开了还是没颜色?检查语言服务器和主题两道关卡
语义高亮依赖语言服务器返回 token 类型,也依赖当前主题映射这些类型。缺一不可——开了开关 ≠ 着色生效。
- TS/JS:确认右下角有 TS 图标和版本号;没图标就按
Ctrl+Shift+P→TypeScript: Restart TS server;确保项目根目录有tsconfig.json(哪怕空对象{}) - Python:必须装
ms-python.pylance(不是ms-python.python),且显式开启:"pylance.semanticTokens": true
- Java:
vscode-java0.64.0+ 默认支持,但需确认"[java]": { "editor.semanticHighlighting.enabled": true }已设为 true - 主题:很多第三方主题(如 One Dark Pro、Nord)没声明
semanticTokenColors字段。临时切到官方Dark+或Light+主题验证;若此时变色了,说明是你当前主题不支持
怎么确认语义信息真传上来了
别猜,用工具看。按 Ctrl+Shift+P → 输入并运行 Developer: Inspect Editor Tokens and Scopes,把光标停在任意标识符上(比如一个函数名、类名、参数),弹出面板里如果出现 semantic token type 字段(例如 function、parameter、class),说明语言服务器已提供语义数据;右下角状态栏显示 Symbol: function 或 Symbol: parameter 也是有效信号。
如果只看到 text.plain 或 source,说明语言模式根本没识别,先解决文件关联或扩展安装问题。
editor.semanticTokenColorCustomizations 是精准着色的核心
语法高亮靠 entity.name.function.ts 这类 TextMate scope,语义高亮靠的是更抽象的 token 类型,比如 function、parameter.declaration、type。自定义必须写在 editor.semanticTokenColorCustomizations 下,不是 tokenColorCustomizations。
关键点:
- 键名必须是标准语义类型,不能简写(
"func"❌,"function"✅) - 支持修饰符通配:
"parameter.declaration"只匹配声明处,"*.declaration"匹配所有声明场景 - 值可以是字符串(
"#61afef")或对象({"foreground": "#56b6c2", "italic": true}) - 示例(只改函数和参数):
"editor.semanticTokenColorCustomizations": {
"rules": {
"function": "#61afef",
"parameter": {"foreground": "#56b6c2", "italic": true},
"parameter.declaration": {"foreground": "#e06c75", "bold": true}
}
}
真正容易被忽略的是:语义高亮和语法高亮是叠加关系,不是替代。它依赖语言服务器实时分析 AST,大项目下会有真实性能开销;某些旧扩展或自定义 grammar 可能根本不返回 semantic token,这时候你配得再细也没用——得先让 token 出来。


















