vscode悬停内容由语言服务器(lsp)通过textdocument/hover返回,非代码片段;需满足jsconfig.json/tsconfig.json存在、jsdoc紧贴函数定义、语言模式正确三条件,注释才生效。

悬停预览不是代码片段,是语言服务器的 hover 响应
VSCode 里鼠标悬停显示的内容(比如函数参数、返回值、JSDoc)从来就不是“代码片段”(snippets),而是由语言服务器(LSP)通过 textDocument/hover 请求返回的结构化信息。你没法把一个 log 片段塞进悬停框里——那属于编辑行为,不是只读提示。想让悬停内容变丰富,得走注释 + LSP 路线,不是改 snippets 配置。
让 JSDoc / docstring 真正生效的三个硬条件
即使写了标准注释,悬停仍只显示函数签名?大概率卡在这三点:
-
jsconfig.json或tsconfig.json缺失:空文件也行,但必须存在,否则 TypeScript 语言服务不完整启动 - JSDoc 与函数定义之间有空行:/** ... */ 必须紧贴函数声明上方,中间不能有空白行
- 右下角语言模式不对:.ts 文件显示为 “TypeScript React” 时,
typescript.json片段不生效,但typescriptreact.json才管用;同理,悬停依赖的是当前激活的语言服务,不是文件后缀
禁用 MDN 链接但保留类型提示的精准开关
很多人关掉 editor.hover.enabled,结果连变量值预览都丢了。其实只需压制 Web API 相关的自动补全链接:
- 在设置中搜
html.suggest.html5,设为false - 再搜
css.mdnsuggest,同样设为false - 执行
Developer: Reload Window(不是重启窗口,必须重载)
改完之后,document.querySelector 悬停不再跳 MDN,但你写的 @param 和推导出的 HTMLElement | null 类型照常显示。
真要注入自定义内容?得写扩展,且注意性能边界
极少数场景需要悬停里显示外部文档、API 响应示例或 DSL 解析结果,这时才需注册 vscode.languages.registerHoverProvider:
- 必须指定准确语言 ID(如
javascript,不是js),且只能对已激活的语言生效 - 返回的
vscode.Hover内容支持MarkdownString,但isTrusted: true才能渲染链接和内联代码 - 千万别在
provideHover里发 HTTP 请求或读文件——会阻塞整个悬停响应,用户鼠标一停就卡住 - 修改了 JSDoc 或 docstring 后,必须保存文件,VSCode 才重新解析;缓存不会自动失效
最常被忽略的是:hover 提示内容不随代码实时刷新,它只在语言服务器重新分析后更新——而这个时机取决于你是否保存、是否触发了类型检查、甚至取决于你有没有在编辑器里滚动过。











