VSCode 无法单独按“变量声明”语义着色,但可通过语义高亮区分定义与引用;失效主因是 semanticHighlighting 关闭、语言模式错误、语法错误致语言服务器中断,或 Inspect 工具显示 token type 实为 identifier 而非 variable。

VSCode 无法直接按“变量声明”这个语义动作单独着色,但能通过语义高亮(semantic highlighting)区分变量定义与引用,前提是语言服务器支持且配置正确。
为什么改了 editor.semanticTokenColorCustomizations 还是没变色?
常见失效不是配置写错,而是底层没提供对应语义标记:
-
editor.semanticHighlighting必须为true(默认开启,但某些插件或旧配置会关掉) - 右下角语言模式必须是真实语言(如
TypeScript),不能是Plain Text或未识别的扩展名 - 文件存在语法错误时,语言服务器(如 TypeScript Server、Pylance)可能中断解析,
variable语义 token 就不会生成 - 用
Developer: Inspect Editor Tokens and Scopes把光标停在const count = 0的count上,确认 semantic token type 确实是variable,而不是identifier(后者是词法层 fallback,不走语义配色)
variable 和 parameter 颜色要分开配吗?
要。它们是不同语义类型,VSCode 不会自动合并:
-
variable:顶层const x = 1、let y、var z声明的标识符 -
parameter:函数参数function foo(a, b)中的a、b,即使用了const声明也归为此类 -
property:对象属性或 class 字段(如class A { id = 1 }中的id) - 如果全想统一成蓝色,就得分别写三条规则,不能只配
variable
示例 settings.json 片段:
"editor.semanticTokenColorCustomizations": {
"rules": {
"variable": { "foreground": "#569CD6" },
"parameter": { "foreground": "#569CD6" },
"property": { "foreground": "#569CD6" }
}
}
__temp、__private 这类变量能高亮吗?
可以,但必须关掉语义高亮过滤逻辑:
-
editor.semanticHighlighting设为false(退回到纯词法匹配) -
editor.occurrencesHighlight设为true(启用同名符号高亮) - 否则语言服务器默认忽略单/双下划线开头的标识符,不纳入符号表
- 注意副作用:
const和let声明将不再有颜色区分,所有关键字都按基础 token 着色
为什么 const _ = getData() 中的 _ 永远不被高亮?
这不是设置问题,是语言服务器的明确设计:
- TypeScript Server、Pylance、Rust Analyzer 等都把单独的
_视为“丢弃占位符”,不注册进符号表 - 它不参与引用追踪,也不会触发
occurrencesHighlight或语义着色 - 想让变量可高亮,得用有意义的名字,比如
_temp或unusedData
真正难调的不是怎么配颜色,而是判断当前高亮行为到底是编辑器限制、主题覆盖,还是语言服务器根本没发 token —— 先用 Inspect Editor Tokens and Scopes 看清底层输出,再动配置。


















