Opened Changes标注文件自打开(或上次建立基线)以来被新增、修改、删除的行,行为接近 Source Insight 的改动标记。
安装 / 调试本扩展没有第三方运行时依赖,纯 CommonJS。 方式一:F5 调试(开发)
方式二:打包成 .vsix 安装(日常使用)
安装后重载窗口(命令面板 → 命令(命令面板
|
| 命令 | 说明 |
|---|---|
Opened Changes: 启用/停用改动标注 |
全局开关 |
Opened Changes: 将当前内容设为基线 |
清除全部改动标记,从这里重新计数 |
Opened Changes: 跳到下一个改动 |
Alt+] |
Opened Changes: 跳到上一个改动 |
Alt+[ |
Opened Changes: 复制当前行的原始内容 |
光标在改动行时复制该块的原始内容;否则复制整个基线内容 |
Opened Changes: 显示与基线的差异 |
打开只读 diff 视图(基线 ↔ 当前) |
设置
| 设置 | 默认 | 说明 |
|---|---|---|
openedChanges.enabled |
true |
总开关 |
openedChanges.colors.unsaved |
#e2b93d |
未保存改动的行标颜色(黄) |
openedChanges.colors.saved |
#3fb950 |
已保存改动的行标颜色(绿) |
openedChanges.showDeletedLines |
true |
是否在概览标尺标出删除位置(悬停可看原内容) |
openedChanges.statusBar |
true |
状态栏统计 |
openedChanges.maxFileLines |
200000 |
超过则停止追踪并释放快照;恢复到限制内后建立新基线 |
openedChanges.copyOriginalOnEmptyLine |
false |
光标在空行时“复制原始内容”是否复制该行原始文本 |
工作方式
每个文件保留两个比较基准:
| 快照 | 何时更新 | 作用 |
|---|---|---|
| 打开快照 | 文件打开时 / 手动「设为基线」 | 决定“哪些行变过”(绿色保留多久) |
| 已保存快照 | 每次保存后 | 决定“哪些行还没保存”(黄色) |
于是每行的颜色只取决于两件事:
- 和已保存快照不同 → 未保存,黄色
- 只和打开快照不同(已经保存过)→ 已保存,绿色
- 两份都一样 → 不标注
文档变化时,按编辑范围更新当前行列表,未变的行与基线共享文本;120ms 防抖后再计算行差异(小区域用 LCS,大文件用“两边唯一行”做锚点切分),合并成带状态的改动块,用 TextEditorDecorationType 只画左侧竖线。改动块中未变的行不会被误标。
内容没有再次变化时,保存直接复用差异结果并更新黄/绿状态。隐藏文件、停用期间不安排后台差异计算,重新显示或启用时再刷新;同一文件的所有分屏都会同步更新。
绘制只传行号范围,悬停时才读取原始/当前内容(每侧最多 20 行,长行截断),避免为大量标记批量生成悬停文本。重复切换到同一版本不会重画。
一个块里只要有一行还没保存,整块显示为黄色。
和 VS Code 自带 Git 标记的区别
自带 Git 标记比较的是 HEAD,保存/提交后就会消失;本扩展比较的是文件打开时的内容,所以未提交、已提交甚至没有 git 仓库的文件都能看到“本次编辑改了什么”。两套标记可以同时显示;如果觉得左侧太花,可以把内置的关掉:"git.decorations.enabled": false。
已知限制
- 只追踪磁盘文件(
filescheme),未命名缓冲区(untitled)不参与 - 文件行数超过
openedChanges.maxFileLines(默认 20 万)时停止追踪并释放快照;文件缩小或提高限制后,以当时内容重新建立基线 - 外部工具改写文件内容时,改动会按“相对打开时的内容”照常显示
项目结构
src/
extension.js 扩展入口:生命周期、命令、状态栏
tracker.js 每个文档的两份快照 + 改动块状态(含 saved/unsaved)
baseline.js 基线快照(纯逻辑,可单测)
diff.js 行差异与改动块合并(纯逻辑,可单测)
navigation.js 上/下一个改动(纯逻辑,可单测)
decorations.js 装饰类型(黄/绿行标样式与配色)
renderer.js 把改动块画到编辑器
hover.js 悬停时按需读取改动内容
contentProvider.js 提供只读“基线内容”用于 diff 视图
test/ node --test 单元测试
test/integration/ 在真实 VS Code 扩展宿主里跑的集成测试
测试
npm test # 单元测试 + 用假 vscode 模块的冒烟测试
npm run check # JavaScript 类型检查
npm run test:integration # 在真实 VS Code 里启动扩展宿主跑命令
npm run benchmark # 独立进程中测量耗时、额外内存和 API 调用次数
npm test覆盖 diff / baseline / navigation / tracker 的逻辑和扩展主链路,包括批量编辑、撤销、CRLF、15 万行粘贴、保存前防抖、分屏、懒加载悬停、超限保护和关闭后的清理。npm run test:integration创建独立的临时 VS Code 配置目录,执行命令、悬停、真实批量编辑和 10 万行编辑保存测试,结束后自动关闭;终端会输出本次报告的路径。可通过VSCODE_BIN指定 VS Code 可执行文件。npm run benchmark -- --source /path/to/other/checkout可以用相同负载测量另一份源码。每个场景默认运行三次,耗时和常驻内存取中位数;这里的内存是扩展状态额外保留的 Node heap / ArrayBuffer,不代表整个 VS Code 的进程占用。
测量结果、具体负载和复现方法见 docs/performance.md。