Code Outline 是当前最轻量、开箱即用且支持 LSP 的代码结构生成方案,它复用 VSCode 内置语言服务的 getDocumentSymbols 接口渲染符号树,零配置依赖已安装的语言插件,大文件默认延迟加载;自定义转换(如 JSON→Go struct)需另写插件调用外部工具。

直接说结论:Code Outline 是当前最轻量、开箱即用、且支持 LSP 标准的代码结构生成方案,无需写代码就能在资源管理器里看到实时符号树;如果需要自定义生成逻辑(比如把 JSON 转成 Go struct),就得自己写插件,核心是调用 vscode.languages.getDocumentSymbols 或封装外部工具链。
Code Outline 为什么能“零配置”生成结构树?
它不解析语法,而是复用 VSCode 内置语言服务返回的符号信息。只要文件类型被 VSCode 正确识别(比如 .ts 文件有 TypeScript 插件,.py 文件有 Python 插件),getDocumentSymbols 就能返回类、方法、变量等节点 —— Code Outline 只负责把它们渲染成树。
- 不依赖特定语言插件的深度功能,只读取标准 LSP
DocumentSymbol响应 - 对大文件默认启用延迟加载,避免卡顿;可通过设置
codeOutline.lazyLoadChildren控制 - 过滤行为由前端完成,不触发额外语言服务请求,响应快
- 注意:若某语言没装对应插件(如打开
.rs但没装 Rust 插件),getDocumentSymbols返回空数组,树就为空
自己写插件生成结构(如 JSON → Go struct)的关键路径
这类需求本质是“文本转换”,和符号导航无关,不能靠 getDocumentSymbols 实现,得走命令执行或 HTTP 调用外部服务。
- 右键菜单触发时,用
vscode.window.activeTextEditor获取当前内容,或用vscode.workspace.openTextDocument读取选中文件 - JSON → struct 场景:调用本地二进制(如
jq+ 自定义脚本)或 spawngo进程运行json-to-go工具 - Curl → Go 代码场景:正则提取 URL、headers、body,再模板化生成
http.NewRequest片段 - 务必检查
vscode.env.appRoot路径是否含空格,否则spawn可能失败 - 错误处理要具体:比如
stderr输出非空时,直接 showErrorMessage 显示原始错误,别只弹“生成失败”
常见踩坑:符号树为空 / 结构不全 / 切换文件后不更新
这不是插件 bug,大概率是语言服务没就绪或文档未被正确激活。
-
onDidChangeActiveTextEditor触发时,编辑器内容可能还没完成语言检测,需加setTimeout延迟 100ms 再调getDocumentSymbols - TypeScript 文件若没
tsconfig.json,TS 语言服务可能降级为 JS 模式,导致类方法不显示 —— 检查状态栏右下角语言标识是否为 “TypeScript” 而非 “JavaScript” - Python 文件如果用了
pyright但没启用 type checking,getDocumentSymbols可能漏掉类型注解相关的 symbol —— 开启"python.analysis.typeCheckingMode": "basic" - 切换标签页时,旧编辑器的
document对象仍有效,但符号信息已过期;必须监听vscode.workspace.onDidOpenTextDocument并缓存最新 document
真正难的不是生成结构,而是判断什么时候该重新生成、哪些符号该保留、怎么和用户当前光标位置联动 —— 这些细节没标准答案,得根据具体语言特性和团队习惯调。


















