VSCode 不支持为行号添加悬停提示,因行号属于编辑器 UI 层,无语义信息且无对应 API;hover provider 仅作用于代码内容区,装饰图标 hover 是唯一间接方案。

VSCode 不支持为代码行号(gutter)添加悬停提示 —— 行号区域本身没有语义信息,也没有 API 允许扩展向其注入 Hover 内容。
为什么 documentSelector 和 registerHoverProvider 对行号无效
VSCode 的 vscode.languages.registerHoverProvider() 只响应编辑器主内容区(即文字 token)的悬停事件,不监听行号、折叠控件、断点图标等 gutter 区域。即使你用 documentSelector: [{ language: 'javascript' }] 注册了 provider,光标移到行号上时 provideHover 根本不会被调用。
- 行号不是语言文档的一部分,它属于编辑器 UI 层,和
TextDocument无关 - VSCode 没有暴露
registerGutterHoverProvider或类似 API(截至 2026 年 10 月) - 所有官方文档和 LSP 规范都未定义 gutter hover 行为,插件无法“覆盖”或“接管”该区域
能间接影响行号附近提示的几种情况
虽然不能直接给行号加悬停,但某些扩展会在行号旁渲染图标(如 GitLens、Error Lens),并让这些图标带 hover 效果 —— 这是靠 DecorationOptions.hoverMessage 实现的,但它只作用于装饰图标,不是行号本身。
-
GitLens在修改过的行号旁加 Git 提示图标,悬停显示 commit 信息 -
Error Lens把错误消息渲染成行号右侧的装饰,hover 显示完整诊断 - 自定义装饰必须用
vscode.window.createTextEditorDecorationType()创建,且hoverMessage只支持纯文本或简单 Markdown(**bold**、`code`),不支持链接或图片
想让某行“可悬停”,得把信息挂到代码内容上
真正可行的做法,是把提示信息绑定到该行的某个实际 token(比如第一个非空字符、注释、或特殊标记),而不是行号。例如:
// @todo: 这里需要重构 —— hover 会显示这行注释
function legacyHandler() { ... }
或者用 JSDoc 绑定到函数声明上,再确保光标落在函数名上触发 hover。
- 行号只是位置索引,没有 AST 节点、没有类型、没有作用域 —— 悬停提示依赖语义分析,而语义分析只发生在 content 区域
- 如果硬要“模拟”,可以写个命令(如
Ctrl+Shift+P → “Show Line Info”)读取当前行内容并弹出 QuickPick 或 Webview,但这不是悬停,也不随鼠标移动响应 - 已有扩展如
Todo Tree能高亮// TODO行并在侧边栏聚合,但它依然不提供行号 hover
行号区域的交互能力是硬限制,不是配置或插件能绕过的。所有试图“给行号加 tooltip”的方案,最终都得退回到内容 token 或装饰图标上做文章。











