VSCode悬浮提示默认不渲染Markdown,仅支持有限HTML标签如、、等,Markdown语法如加粗或链接原样显示;需手动转换为白名单标签且禁用样式与交互。

VSCode悬浮提示默认不渲染Markdown
VSCode 的 hover 提示(鼠标悬停时弹出的 tooltip)原生只支持纯文本和极简 HTML 标签(如 <code>、<br>),不解析 Markdown 语法。写 **加粗** 或 [链接](#),它就原样显示字符串,不会变粗、不会跳转、也不会换行——这不是配置没开,是语言服务器或编辑器本身没这个能力。
常见错误现象:
• 写了 /** @returns {string} 返回值说明:**支持中文** */,悬停里看到的是字面量 **支持中文**
• 在 TypeScript 的 JSDoc 里用 ```ts 包代码块,结果整段当一行文本挤在一起
• 用 markdown-it 渲染好 HTML 字符串传给 HoverProvider,但发现 <pre class="brush:php;toolbar:false;"></code>、<code><ul></code> 等标签被过滤或忽略</p><H3>要让 hover 显示富文本,必须返回 HTML 字符串并遵守白名单规则</H3><p>VSCode 的 <code>HoverProvider.provideHover</code> 接口允许返回 <code>MarkedString[]</code> 或 <code>Hover</code> 对象,其中内容字段若为字符串,会被当作「支持有限 HTML」的富文本处理。但注意:<br>• 只有 <code><code></code>、<code><pre class="brush:php;toolbar:false;"></code>、<code><em></code>、<code><strong></code>、<code><br></code>、<code><p></code>、<code><ul></code>、<code><ol></code>、<code><li></code> 等少数标签被保留<br>• 所有属性(如 <code>class</code>、<code>style</code>、<code>onclick</code>)一律被剥离<br>• <code><a></code> 标签不生效,无法点击跳转</p><p>实操建议:<br>• 不要用 <code>marked</code> 或 <code>markdown-it</code> 直接输出完整 HTML——它们生成的 <code><div></code>、<code><section></code> 全部被删,只剩文本<br>• 手动映射常用 Markdown 元素到白名单标签:<br> – <code>**text**</code> → <code><strong>text</strong></code><br> – <code>*text*</code> → <code><em>text</em></code><br> – 代码块用 <code><pre class="brush:php;toolbar:false;"><code>...</code></pre>,别嵌套 <span></span>
• 换行必须显式写 <br>,Markdown 的空行或双空格无效
• 中文标点、Unicode 符号可直接使用,无需转义
实现 Markdown↔ HTML 互转,支持导出 PDF,用于用户请求的文档格式转换。
自定义 HoverProvider 时容易漏掉的兼容点
如果你在写插件或 Language Server,返回 Hover 对象时,以下细节直接影响渲染效果:
• contents 字段如果是 MarkedString 数组,每个元素会被拼接,但换行需靠 <br> 或 <p></p>,不能依赖数组分隔
• 若含 Location(比如想让 hover 里带跳转链接),VSCode 仅在 vscode:// 协议下支持,且只响应 Location,不响应 HTML 里的 <a></a>
• 字体大小、颜色、行高完全由 VSCode 主题控制,无法通过内联 style 覆盖
• 长文本会自动截断并显示“…”——没有 API 控制展开,只能精简内容
一个最小可行示例(TypeScript):
provideHover(document, position, token) {<br> const range = document.getWordRangeAtPosition(position);<br> const word = document.getText(range);<br> return new Hover([<br> '<p><strong>参数名</strong>:</p>',<br> '<p>类型:<code>string</code><br>用途:标识用户 ID</p>',<br> '<pre class="brush:php;toolbar:false;"><code>getUser("123")</code>']);
}
真正难的不是怎么写 HTML,而是判断哪些信息值得放进 hover——它空间极小、无交互、不可滚动。公式、表格、多级列表、Mermaid 图表,全都不适合放进去。这类内容应该引导用户去预览页或文档页,而不是硬塞进 tooltip。

















