Hover中代码高亮由语言服务器生成的语义token决定,需用editor.semanticTokenColorCustomizations精准配置scope(如function.declaration),配合Developer: Inspect Editor Tokens and Scopes实时验证,而非editor.tokenColorCustomizations。

VSCode 悬停提示(Hover)里的代码高亮不能靠 editor.tokenColorCustomizations 直接控制——它走的是语义高亮(Semantic Highlighting)和语言服务器渲染路径,不是编辑器主视图的 TextMate 语法层。
悬停提示的高亮由谁决定?
Hover 中的代码块(比如函数签名、类型定义、文档里的内联代码)默认使用当前主题的 text 和 string 等基础 token 颜色,但实际渲染逻辑更复杂:
- 语言服务器(如 TypeScript Server、Pylance、Rust Analyzer)生成 Hover 内容时,会附带 TextMate scope 信息;
- VSCode 将这些 scope 映射到内置的「hover token color」规则,优先级高于用户设置的
editor.tokenColorCustomizations; - 最终颜色还受
workbench.colorCustomizations中editorHoverWidget.foreground、editorHoverWidget.background等 UI 色值影响。
怎么改 Hover 里函数名/关键字的颜色?
你得用 editor.semanticTokenColorCustomizations,而不是 editor.tokenColorCustomizations。因为 Hover 内容走语义高亮通道,只有这个配置能覆盖它:
- 打开
settings.json,添加editor.semanticTokenColorCustomizations字段; - scope 名必须精准,例如
"function.declaration"或"keyword.control",不能只写"function"; - 推荐先在编辑器中触发 Hover,然后按
Ctrl+Shift+P→ 输入Developer: Inspect Editor Tokens and Scopes,把光标移到 Hover 弹窗内的目标代码上,查看真实 scope; - 示例:让 Hover 中所有函数声明名变蓝,可加:
"editor.semanticTokenColorCustomizations": {
"rules": {
"function.declaration": { "foreground": "#2196F3", "fontStyle": "bold" },
"parameter": { "foreground": "#9C27B0" }
}
}
为什么改了没生效?常见踩坑点
悬停高亮不响应修改,大概率卡在这几个地方:
- 用了
editor.tokenColorCustomizations.textMateRules—— 这个对 Hover 无效; - scope 写得太宽泛,比如只配
"function",而实际 Hover 里是"function.call"或"function.method"; - 语言插件未启用语义高亮:检查对应语言设置里是否开了
"(如.semanticHighlighting": true typescript.preferences.semanticHighlighting); - 主题本身禁用了语义高亮:某些轻量主题会设
"editor.semanticHighlighting": false,需手动覆盖为true; - Hover 内容来自 Markdown 文档片段(如 JSDoc),此时高亮依赖
markdown相关 scope,要单独配"markup.inline.raw.string"这类。
想高亮 Hover 里的特定字符串(如 TODO、error)怎么办?
原生机制做不到——Hover 是只读渲染区,不支持正则匹配或插件注入。但可以曲线救国:
- 用
vscode-highlight插件配highlight.regexes,它能在编辑器主区域高亮//TODO,但对 Hover 无效; - 真正能影响 Hover 文本的,只有语言服务器返回的内容结构;
- 如果你用的是 TypeScript,可通过 JSDoc 的
@see或自定义 TSDoc 标签,再配合插件(如Document This)增强注释生成质量,间接提升 Hover 可读性; - 终极方案:提交 issue 给对应语言插件(如 Volar、Pylance),要求其在 Hover 中为关键标记添加标准 scope。
悬停提示的高亮本质是语言服务 + 主题渲染的联合结果,不是纯前端样式开关。最易被忽略的是:你看到的 scope 名,可能和语言服务器实际发出的 scope 不一致,必须用 Inspect 工具实时抓取,抄网上的通用配置大概率失效。











