为什么全局 Undo 糟糕:为 VS Code 构建行级 Undo/Redo

发布: (2026年1月12日 GMT+8 10:09)
7 min read
原文: Dev.to

抱歉,我目前没有看到需要翻译的正文内容。请您把要翻译的文本(除代码块和链接外)粘贴在这里,我会按照要求将其翻译成简体中文并保留原有的格式。

问题:全局撤销为何让开发者抓狂 😤

如果你已经使用 VS Code 足够久,可能会遇到这样的情形:

  1. 你在同一个文件的两个不同位置进行编辑。
  2. 你发现其中一行有拼写错误。
  3. 你按下 Ctrl + Z

突然,完全不相关的内容消失了。

没有任何技术层面的错误——但你的工作流被打断了。 🫠

全局撤销基于时间的。它会把编辑器回退到历史上的某个时间点,而不管你想撤销的是什么

但开发者的思考方式不是时间,而是意图

  • “撤销这行代码”
  • “恢复那个拼写错误”
  • “把这行恢复到之前的状态”

相反,全局撤销回答的是另一个问题:

“上一次编辑操作是什么?”

这种不匹配正是 Ghost Line 存在的全部原因。

使用 Ghost Line 👻(从这里开始)

Ghost Line 并不会取代原生撤销——它 并行 工作,且不干扰。核心理念很简单:仅撤销或重做当前行,不影响其他内容。

键盘快捷键 ⌨️

操作快捷键
行撤销Ctrl + Alt + Z
行重做Ctrl + Alt + Y
列出行撤销历史Ctrl + Shift + Alt + Z
列出行重做历史Ctrl + Shift + Alt + Y

📸 截图 – VS Code 键盘快捷键

显示行撤销、重做、列出撤销、列出重做的绑定

行级撤销/重做实战 🎥

在下面的剪辑中,我仅对当前行进行撤销和重做,不影响文件的其他部分。随后我打开行级历史选择器,预览并恢复该行的之前版本——没有全局撤销,也没有连带损害。👻

📽 演示 – 行级撤销/重做 + 历史选择器

Ghost Line 演示

真正重要的配置 ⚙️

Ghost Line 将配置保持在最小且有意义的范围。

  • 每行最大历史记录数 – 限制每行存储的快照数量。
  • 空闲延迟 – 控制快照捕获的频率。
  • 快捷键切换 – 允许在不卸载扩展的情况下禁用 Ghost Line 的键绑定。

没有冗余设置。也不需要微调的执念。

📸 截图 – VS Code 设置(Ghost Line 配置)

ghostLine.maxHistoryPerLine、idleDelay 和 enableShortcuts

Ghost Line 工作原理(高级) 🧠

  • 每一行都有各自的撤销/重做历史。
  • 历史记录基于快照,而非差异。
  • 行撤销能够安全地与原生 VS Code 撤销并行运行。

内部实现值得深入探讨;本文侧重于快速获取价值。

边缘情况、限制与后续计划 🧩

已处理的边缘情况

有些问题不可避免——但可管理:

  • 由于插入或删除导致的行号偏移。
  • 新编辑后重做失效。
  • 当不存在历史记录时安全的空操作。
  • 对原生 VS Code 撤销零干扰。

Ghost Line 会在文件结构变化时仍保持历史记录的一致性 🔄。

当前限制 ⚠️

Ghost Line 精确而非魔法。目前:

  • 不支持基于块或范围的撤销。
  • 多行编辑尚未得到一等支持。
  • 历史记录是 会话范围 的(不会在重新加载后持久化)。

这是一种有意的范围控制,而非缺乏雄心。

接下来计划 🚧

计划中的改进包括:

  • 悬停预览撤销/重做状态。
  • 更好的多行感知。

没有时间表。没有承诺。只有方向 🧭。

结论:撤销应尊重意图 🎯

全局撤销优化的是简洁性。开发者优化的是工作流。

Ghost Line 是一次 意图感知编辑 的实验——撤销你本意想撤销的,而不是最近发生的操作。

这种功能首先应当出现在扩展中,在那里可以进行测试、破坏和改进。如果全局撤销有一天变得更智能,那就太好了。 在此之前,Ghost Line 就是为那些精确度重要的时刻而存在 👻。

感谢 & 链接 🙌

感谢阅读!

Ghost Line 最初是为了解决日常的一个小烦恼而进行的实验,随后逐步演变为让撤销操作不再那么“毁灭性”的专注尝试。

如果这与你产生共鸣——或者 Ctrl + Z 曾经背叛过你——我非常期待你的反馈。

  • Issues / Feature Requests – 欢迎提交 bug、边缘情况以及各种想法。
  • Contributions – 欢迎提交 PR,尤其是关于正确性、用户体验和边缘情况的改进。
  • Discussion – 让我们在下面的评论区聊聊吧 😄

GitHub Repository: (replace with the actual repo URL)

[vaayam-L/ghost-line](https://github.com/Namasivaayam-L/ghost-line)

**VS Code Extension**:  
[**Ghost Line**](https://marketplace.visualstudio.com/items?itemName=namachu.ghost-line)

It’s an open‑source project, built in public.

If it saves you even one unnecessary undo — mission accomplished 👻✨  

---

**P.S. A quick request! 📝**

This is actually my **first**‑ever technical blog post. I tried to keep it concise and respectful of your time, but I’m still learning.

I would genuinely appreciate feedback on the structure and writing style—let me know in the comments if the flow worked for you or if I should change things up for the next one!
Back to Blog

相关文章

阅读更多 »

我让 Codedraft 变得主动!

概述:CodeDraft 现在已激活并处于观察状态。它不再等你记得捕获学习内容,而是在后台运行,主动在需要时提出建议……