本文件面向 AI 编程助手。如果你刚接触这个项目,请先阅读本文以了解项目结构、构建方式与开发约定。
vscode-jump-history 是一个 VS Code 扩展插件,用于自动记录用户通过 Ctrl + 点击 或 Go to Definition (F12) 产生的源码跳转堆栈,并在左侧 Explorer 边栏中以嵌套树形结构展示跳转路径。点击历史节点可快速回到对应位置。
- 名称:
vscode-jump-history - 版本:
0.0.1 - 最低 VS Code 引擎版本:
^1.74.0 - 入口文件:
out/extension.js - 激活时机:
onStartupFinished(VS Code 启动完成后自动激活)
- 语言: TypeScript 5.x
- 运行时: Node.js(VS Code Extension Host)
- 包管理器: pnpm(存在
pnpm-lock.yaml) - 核心依赖:
@types/vscode: VS Code Extension API 类型定义@types/node: Node.js 类型定义typescript: 编译器
.
├── src/
│ ├── extension.ts # 插件主入口:注册事件监听、命令、跳转检测逻辑
│ └── historyTreeProvider.ts # TreeDataProvider:管理 JumpRecord 堆栈并渲染树节点
├── out/ # TypeScript 编译输出(CommonJS + SourceMap)
├── package.json # 插件清单(manifest):views、commands、menus、activationEvents
├── tsconfig.json # TypeScript 编译配置
├── pnpm-lock.yaml # pnpm 锁定文件
├── .vscode/
│ ├── launch.json # Extension Host 调试配置(F5 启动)
│ └── tasks.json # 默认构建任务:运行 `npm run watch`
├── .vscodeignore # 打包 .vsix 时排除的文件列表
├── vscode-jump-history-0.0.1.vsix # 已构建的插件包
└── README.md # 面向用户的说明文档
- 导出
activate与deactivate函数。 - 在
activate中:- 实例化
HistoryTreeProvider并注册到jumpHistoryTree View。 - 订阅
onDidChangeActiveTextEditor与onDidChangeTextEditorSelection事件,检测编辑器/选区变化。 - 注册两条命令:
jumpHistory.clear(清空历史)和jumpHistory.goToLocation(跳转到指定位置)。
- 实例化
checkAndRecordJump(uri, range)是核心检测逻辑:- 忽略同一文件 5 行以内的微小变化。
- 对非 Go 相关文件排除
http/https纯 URL 跳转。 - 通过防抖(debounce,150ms)后,调用
vscode.executeDefinitionProvider等 5 个 Provider 命令反推上一次位置是否指向当前位置。 - 若匹配,则将
from → to的跳转记录压入HistoryTreeProvider。
JumpRecord接口:描述一次跳转(from、to、timestamp)。HistoryTreeProvider:实现vscode.TreeDataProvider<HistoryNode>,内部维护一个JumpRecord[]堆栈。buildPath()将堆栈从底向上构建为嵌套树节点(每个节点只有一个子节点),形成一条线性链路。HistoryNode:继承vscode.TreeItem,显示目标文件基名与行号,描述为来源文件基名与行号,点击时触发jumpHistory.goToLocation。
所有脚本定义在 package.json 的 scripts 字段中:
# 一次性编译 TypeScript
pnpm run compile
# 监听模式编译(开发时常用)
pnpm run watch编译产物输出到 out/ 目录,模块格式为 CommonJS,目标版本 ES2020,启用 sourceMap。
- 在 VS Code 中打开本项目。
- 按
F5(或运行调试配置 "Run Extension")。 - 这会先执行默认构建任务
npm run watch,然后启动一个新的 Extension Host 窗口。 - 在 Extension Host 窗口中打开任意代码项目,使用
Ctrl + 点击或F12跳转定义,观察左侧 Explorer 的 Jump History 视图。
- 严格模式:
tsconfig.json中启用了"strict": true,要求所有代码符合 TypeScript 严格类型检查。 - 文件命名: 使用小写驼峰(如
extension.ts、historyTreeProvider.ts)。 - 导入风格: VS Code API 使用
import * as vscode from 'vscode',Node 内置模块使用import * as path from 'path'。 - 注释语言: 项目中的注释和文档以中文为主。
- 错误处理: Provider 查询使用
.catch(() => undefined)静默忽略异常,整体逻辑包裹在try/catch中,错误输出到控制台并回退lastPosition。
- 当前状态: 项目中没有自动化单元测试或集成测试。
- 测试方式: 完全依赖手动在 Extension Host 中验证:
- 启动 Extension Host(F5)。
- 打开目标代码仓库,执行跳转操作。
- 检查 Jump History 视图是否正确记录、树形渲染是否正常、点击回跳是否准确、清空按钮是否生效。
- 使用
vsce(或@vscode/vsce)工具打包为.vsix:vsce package
.vscodeignore已配置排除以下文件:.vscode/.vscode-test/src/.gitignoretsconfig.jsonpnpm-lock.yamlnode_modules/
- 项目根目录已存在构建好的
vscode-jump-history-0.0.1.vsix。
- 插件通过
vscode.commands.executeCommand调用内部 Provider 命令(如vscode.executeDefinitionProvider)来反推跳转关系,这些命令是 VS Code 官方暴露的私有 API,行为在不同版本中可能略有差异。 isNavigatingFromHistory标志用于防止从历史记录点击回跳时触发新的跳转记录,避免循环。该标志在finally块中通过setTimeout(..., 300)复位,若修改此逻辑需注意竞态条件。- 当前对 Go 文件做了特殊处理(
isGoRelated),允许记录可能涉及 URL 的跳转;修改此逻辑时需考虑是否影响其他语言。
| 操作 | 命令 |
|---|---|
| 编译 | pnpm run compile |
| 监听编译 | pnpm run watch |
| 调试 | 按 F5(Run Extension) |
| 打包 | vsce package |
| 清空历史 | jumpHistory.clear |
| 回跳位置 | jumpHistory.goToLocation |