在虚拟机里退出vim,不用慌,重新打开同名文件看到swap提示后按R键恢复,或者直接用vim -r 文件名这个命令,就能回到未保存的编辑现场。 这套机制听起来像冷知识,但几乎每个用过vim的程序员都该把它变成肌肉记忆,下面按不同的退出场景拆开讲,每一步都能在终端里直接验证。
vim退出后怎么恢复编辑?先弄清你手上有什么
最直接的处理:重新打开文件,回应swap提示
如果在终端里直接关了vim,或者SSH突然断开,只要文件路径和文件名没变,重新用vim打开同一文件,屏幕上会跳出E325提示,内容是“Swap file .xxx.swp already exists!”,此时选项里有四个字母按键:
- R:恢复(Recover),读取swap文件写入缓冲区,回到上次交换文件保存时的内容
- E:只读打开(Edit anyway),内容停留在磁盘上的旧版本,忽略swap
- Q:退出(Quit),先不处理
- A:放弃(Abort),继续强开
按R之后,vim会列出swap文件里记录的编辑时间,然后把缓冲区内容恢复到交换文件最后写入的状态,多数情况下,你上一次按下i键且没来得及输完的内容,都在这里等着。
终端已经关了,用vim -r命令找回全部swap文件
另一种常见状况是终端窗口整个被关掉,连提示都没看到,这时用vim -r列出所有交换文件:
vim -r
输出会显示当前目录下所有swap文件,以及它们对应的原文件路径和时间戳,确认目标文件后,输入:
vim -r 文件名
就能进入恢复模式,这条命令就是vim恢复未保存文件的标准答案,恢复后建议先看一遍内容,按wq保存,再手动清理掉swap文件:
rm .文件名.swp
虚拟机vim未保存退出如何恢复?光靠swap还不够
swap文件能救什么,救不了什么
swap文件默认每隔一段时间由vim写入一次,写入频率受updatetime控制,默认是4000毫秒,也就是说,最多会丢失最后4秒的输入,这个机制在物理机和虚拟机里表现一致,但如果你的ssh连接在写swap之前就断了,并且终端没有同步数据,那么最后几秒的内容确实找不回来,行业共识认为,把updatetime调小到100毫秒,能明显降低这类丢失概率。
开启undofile,把撤销历史也持久化下来
swap解决的是崩溃恢复,undofile解决的是“恢复之后想继续撤销”的需求,在vimrc里加上:
set undofile
set undodir=~/.vim/undo
这样每次编辑过程中的撤销记录都会写入独立文件,即使退出vim、重启系统,重新打开文件后依然能用u一路撤回到很早之前的版本,对于在虚拟机里写脚本、调试配置的场景,这个选项比swap更灵活。
配置viminfo,让命令历史和寄存器也留底
靠viminfo保存,比如命令历史、搜索历史、寄存器内容,设置:
set viminfo='100,<1000,:100
但能帮你找回之前执行过的那条替换命令,或复制到寄存器里的字符串,三者配合起来,才算一套完整的恢复方案。
恢复操作的避坑指南:什么时候要手快,什么时候要手稳
看到swap文件存在,先别急着删
很多人在vim提示swap存在时顺手就按了D删除,这等于把唯一的恢复线索扔掉了,正确顺序是先按R恢复,确认内容完整,再决定要不要清理,业内专家指出,在虚拟机或云服务器环境中,误删swap文件是导致配置丢失的最常见操作失误。
恢复后做一次明确的保存
仍在内存里,不写盘不代表安全,执行wq或者w,让缓冲区内容覆盖磁盘文件,保存成功后再清理swap文件,整套流程才不会留下残留提示。
多窗口编辑下的swap冲突
如果同一个文件在多个vim窗口里打开,vim会提示交换文件已存在,但可能是另一个正在编辑的进程,而不是崩溃残留,这时不能用R直接恢复,否则会覆盖另一个窗口的未保存内容,先通过ps -ef | grep vim确认进程,再做操作。
防大于治:让下次退出不再手忙脚乱
调低updatetime,配合自动写回
在vimrc中设置:
set updatetime=100
set autowrite
前者让swap文件每100毫秒更新一次,后者在切换缓冲区时自动保存,两条配置合在一起,相当于给编辑过程上了双保险。
用tmux给SSH会话加一层保险
多数情况下,vim退出后恢复失败是因为SSH会话本身先断了,tmux是一款免费开源的终端复用工具,不会给开发环境增加一分钱成本,只需在连接服务器后先执行tmux再打开vim,即使SSH断开,重新登录后执行tmux attach,vim进程还在原地等你,这一招在本地虚拟机里同样适用。
三种保护机制的取舍
| 机制 | 恢复范围 | 配置成本 | 适合场景 |
|---|---|---|---|
| swap文件 | 退出或崩溃前的文本内容 | 零配置 | 所有vim用户 |
| undofile | 历史撤销记录 | 两行vimrc配置 | 经常写长文件 |
| tmux | 整个终端会话 | 安装tmux并执行一次 | SSH远程或虚拟机内 |
恢复vim编辑状态的核心,始终是理解swap文件、undofile和tmux这三层防线在想什么,下次再在虚拟机里被踢出vim,先想想刚才按过什么键,再决定用R还是vim -r,都比重新敲一遍代码要快得多。
vim退出恢复常见问题解答
用Ctrl+Z退出vim,算不算退出?
不算,Ctrl+Z是把vim挂起到后台,相当于暂停,只要在shell里输入fg就能回到vim界面,静默状态下的内容都还在,注意区分挂起和真正退出:后者会触发swap恢复流程,前者不会。
删掉swap文件后,未保存的内容还能恢复吗?
取决于是否开启undofile,如果开过,重新打开文件后缓冲区内容来自磁盘,但可以用u撤销到swap被删除之前的某个版本,如果没开,磁盘上没有任何恢复线索,只能重写。
本地虚拟机和云服务器上的vim恢复配置有什么不同?
没有本质差异,底层都是ex读写同一个swap目录,比较明显的区别在于:云服务器往往存在更频繁的SSH断连,建议额外配合tmux;本地虚拟机则受宿主机休眠影响更大,建议把undodir放到持久化磁盘而不是临时分区,两者都值得设置updatetime=100。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/929748.html


评论列表(2条)
这篇文章的内容非常有价值,我从中学习到了很多新的知识和观点。作者的写作风格简洁明了,却又不失深度,让人读起来很舒服。特别是文件部分,给了我很多新的思路。感谢分享这么好的内容!
@老愤怒4681:这篇文章写得非常好,内容丰富,观点清晰,让我受益匪浅。特别是关于文件的部分,分析得很到位,给了我很多新的启发和思考。感谢作者的精心创作和分享,期待看到更多这样高质量的内容!