直接修改editor.semanticTokenColorCustomizations中function和class规则可生效,但前提是语言服务器已正确解析语义:需确认右下角语言模式为TS/JS/Python等LSP支持语言、"editor.semanticHighlighting": true已启用、Developer: Inspect Editor Tokens and Scopes显示semantic token type确为function或class,且代码无语法错误。

直接改 editor.semanticTokenColorCustomizations 里的 function 和 class 规则就能生效,但前提是语言服务器已正确解析出语义——否则你调的只是“function”这个关键字,不是你写的 getUserById 或 ApiService。
为什么改了 function 却没变色?
最常见的情况是:VSCode 根本没把你的函数名识别为 function 语义类型。这和语法高亮无关,纯属语义层未就绪。
- 右下角语言模式必须是
TypeScript、JavaScript、Python等支持 LSP 的语言,不能是Plain Text或JSON - 检查设置中
"editor.semanticHighlighting": true是否启用(默认开,但某些插件或旧配置可能关掉) - 打开命令面板,运行
Developer: Inspect Editor Tokens and Scopes,把光标停在函数名上,看弹窗里semantic token type是否为function;如果不是,说明语言服务器没解析成功 - 代码存在语法错误(比如少括号、引号不匹配)会中断语义分析,导致后续所有标识符无法打标
function 和 method 必须分开配
在 TypeScript/JS 中,顶层定义的函数是 function,类内部的函数是 method;Python 同理,模块级函数是 function,class 内的 def 是 method。配错就完全看不到效果。
- 想统一高亮所有可调用实体?可以同时写
"function"和"method",但建议颜色一致,避免视觉割裂 - 构造函数(如
constructor)通常归为method,部分语言服务器会加.declaration修饰符,可用"method.declaration"单独命中 -
class类型只覆盖类声明名(class MyClass中的MyClass),不覆盖实例化时的类名(new MyClass()中的MyClass)——后者属于type或support.class,需走textMateRules
怎么让 class 和 function 在不同场景有不同样式?
语义规则支持通配符和修饰符组合,比如声明位置、只读性、导入来源等,但依赖语言服务器是否输出这些信息。
-
"*.declaration"匹配所有声明场景(const foo =、function bar()、class Baz),适合加粗强调 -
"parameter"是独立类型,不属于function,别混在一起配;它控制的是函数签名里的形参名,不是函数本身 - 想区分导出的函数?目前无原生
exported.function类型,但可通过textMateRules+source.ts keyword.control.export这类 scope 组合近似实现 - 性能影响极小,但规则过多(>50 条)可能轻微拖慢首次加载,建议只保留真正需要区分的几类
最容易被忽略的是:语义高亮和 TextMate 高亮共存时,前者优先级更高;如果你在 textMateRules 里配了 support.function,又在 semanticTokenColorCustomizations 里配了 function,最终生效的是后者——但前提是语义标记真被打了出来。


















