最准的方法是直接修改 editor.semantictokencolorcustomizations 中的 function 规则,但前提是语言服务器必须将函数名(如 fetchuser)识别为语义类型 function,而非仅关键字 function;需先验证语义高亮是否生效、检查语言模式、运行 inspect editor tokens and scopes 确认 semantic token type,并注意 function 与 method 的严格区分。

直接改 editor.semanticTokenColorCustomizations 里的 function 规则最准,但前提是语言服务器真把你的函数识别成了语义意义上的“函数”——否则你调的只是 function 这个关键字,不是 fetchUser 或 handleClick 这类实际函数名。
先确认语义高亮是否真正生效
VSCode 默认开启语义高亮,但很多情况下它根本没跑起来。别急着改配置,先验证:
- 右下角语言模式必须是
JavaScript、TypeScript、Python等支持 LSP 的语言,不能是Plain Text或JSON - 打开命令面板(
Ctrl+Shift+P),运行Developer: Inspect Editor Tokens and Scopes,把光标停在目标函数名上,看弹窗里semantic token type是否为function(JS/TS)或function+declaration(Python) - 检查设置中
"editor.semanticHighlighting": true是否启用(默认开,但某些插件或旧配置可能关掉) - 代码存在语法错误(比如括号不闭合、引号错位)会中断语义分析,导致后续所有标识符无法打标
区分 function 和 method:配错就完全没效果
这是最常踩的坑。语义类型严格区分作用域:
- 在 JavaScript/TypeScript 中:
function calculate()是function;class A { method() {} }里的method是method,不是function - 在 Python 中:模块顶层的
def foo():是function;class B:内部的def bar():是method - 想统一高亮所有可调用实体?得同时写
"function"和"method",且建议颜色一致,否则视觉割裂 - 构造函数
constructor属于method,部分语言服务器会加.declaration修饰符,可用"method.declaration"单独命中
退而求其次:用 textMateRules 匹配函数名(语法层)
如果语义层始终不工作,或你想覆盖更广范围(比如包括内置函数、导入函数),就得切到语法高亮层,靠 textMateRules + scope:
- 打开
Developer: Inspect Editor Tokens and Scopes,停在函数名上,抄最具体那个scope,比如support.function.builtin.python或entity.name.function.js -
scope太宽泛(如只写function)通常无效;太具体(如带语言后缀)又只在对应文件生效 - 常见可用 scope 示例(按优先级从高到低):
entity.name.function(声明位置)、support.function(调用位置)、support.function.builtin(内置函数) - 配置示例(放入
editor.tokenColorCustomizations.textMateRules):
{
"scope": ["entity.name.function"],
"settings": { "foreground": "#56B6C2" }
}
注意优先级和覆盖关系
editor.semanticTokenColorCustomizations 优先级高于 editor.tokenColorCustomizations。如果你同时配了两者,语义规则会盖掉语法规则——这意味着你改了 textMateRules 却没反应,大概率是语义层已接管,但你配的 function 类型没被识别出来。
真正难搞的不是怎么写配置,而是让语言服务器稳定输出正确的语义类型:LSP 启动延迟、文件未被纳入项目、tsconfig.json 或 pyproject.toml 配置不当,都会导致 function 标记失败。每次改完颜色没变化,先回到 Inspect Editor Tokens and Scopes 看一眼,比反复改 JSON 有效得多。











