Vim 撤销与恢复依赖 u 和 Ctrl+R 及其分支式撤销树机制;支持多级回退、:undolist 查看状态、:undo {n} 跳转、持久化 undo 跨会话保留历史。

在 Vim 中撤销错误操作和恢复被删代码,核心靠的是 u(undo)和 Ctrl+R(redo),但真正关键的是理解它的撤销树机制——它不是线性历史,而是分支结构,支持多级、可回溯的撤销与重做。
快速撤销和重做
这是最常用也最直接的方式:
- u:撤销上一步编辑(比如误删、误改、误粘贴);连续按 u 可逐级回退
- Ctrl+R:重做刚撤销的操作(比如撤多了想找回);连续按可逐级重做
- 注意:普通模式下操作才计入 undo 树;插入模式中连续输入默认算作“一步”,退出插入模式才算提交
用 :undo 和 :redo 查看并跳转到指定状态
当操作较多、记不清撤了几步时,可以可视化当前撤销树:
- 输入 :undolist,会列出所有可回退的 undo 状态编号、时间、行数变化
- 输入 :undo {n}(如
:undo 5),直接跳转到编号为 5 的状态 - 输入 :redolast 或 :redo 可回到最近一次未被撤销的修改点
恢复被删除但已退出插入/正常模式的代码段
如果删完就按了 Esc 并执行了其他操作(比如移动光标、保存),只要没退出 Vim,内容仍在 undo 树里:
- 先按 u 回退删除动作;若删得早,可能需要多按几次
- 如果已保存(:w)再删,u 仍有效——Vim 的 undo 默认保留整个会话历史(除非禁用了)
- 万一撤销过头,用 Ctrl+R 往回找;配合 :undolist 能更快定位“删之前”的那个节点
预防下次误删:开启持久化 undo
默认情况下,Vim 关闭后 undo 历史就清空。想跨会话恢复(比如重启 Vim 后还能 undo 上次删的内容),需启用持久化 undo:
- 在
~/.vimrc中添加:
set undofile
set undodir=~/.vim/undo//(确保目录存在:mkdir -p ~/.vim/undo) - 这样每次保存都会写入 undo 文件,下次打开同一文件时,u 依然可用
- 注意:对临时文件(如
:e!重载或新建无名缓冲区)不生效

















