-
用 vi/vim 命令打开文件时(即使未修改),会在源文件的同一目录下(而不是执行命令的目录),创建一个名为
.filename.swp
的交换文件。- 例:先用 vim f1 打开编辑窗口,然后在另一个终端查看文件列表,可以看到 swp 文件:
# ls -alh -rw-r--r-- 1 root root 6 Nov 12 12:25 f1 -rw-r--r-- 1 root root 12K Nov 12 12:25 .f1.swp
- 交换文件记录了源文件的原始内容、用户每次修改的增量内容,从而允许用户撤销操作、重做操作。
- 交换文件会比源文件的体积更大一些。
- 退出 vi/vim 时,会自动删除交换文件。
- 例:先用 vim f1 打开编辑窗口,然后在另一个终端查看文件列表,可以看到 swp 文件:
-
执行
:w
保存文件时(即使未修改),vi/vim 会将当前内容保存到源文件。根据配置参数 backupcopy 取值的不同,有几种保存方式:backupcopy=yes
- 原理:根据交换文件,得到文件的修改结果,保存为一个名为
filename~
的备份文件。然后拷贝备份文件的内容,覆盖式写入源文件。最后删掉备份文件。 - 优点:源文件的 inode 不变,文件属性不变。
- 缺点:如果文件体积大,则拷贝需要一定耗时。如果同时有其它程序在修改源文件,则可能出错。
- 原理:根据交换文件,得到文件的修改结果,保存为一个名为
backupcopy=no
- 原理:先创建一个备份文件,并将它的文件属性改成跟源文件一致。然后删除源文件,将备份文件重命名为源文件。
- 优点:几乎没有耗时。
- 缺点:
- 源文件被删了,创建新文件,inode 变化。
- 新文件的文件属性可能不一致,比如当前用户无权修改某个属性。
- 如果源文件是一个软链接,则新文件会是一个普通文件。
backupcopy=auto
- 原理:自动判断。优先采用 no 方式,如果遇到以下情况,则采用 yes 方式:
- 源文件是软链接。
- 源文件的文件属性不能全部复制到新文件。
- 默认配置了
backupskip=/tmp/*
,表示修改该路径下的文件时,不会创建备份文件。
- Unix 系统的 vi/vim 默认采用 yes 方式,而大部分 Linux 发行版的 vi/vim 采用 auto 方式。
- 参考文档:https://vimdoc.sourceforge.net/htmldoc/options.html#‘backupcopy’
- 原理:自动判断。优先采用 no 方式,如果遇到以下情况,则采用 yes 方式:
-
执行
:set xxx
可临时修改 vim 的配置参数,也可以将配置参数永久保存到/etc/vimrc
或~/.vimrc
文件。 -
用 vi/vim 打开一个文件时,可能遇到这种报错:
Swap file ".f1.swp" already exists! [O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort:
该报错表示该文件已存在交换文件,可能是因为:
- 此时有其他用户正在用 vi/vim 打开该文件,而一个文件同时只允许被一个 vim 进程修改。
- 之前某个用户用 vi/vim 打开了该文件,但 vi/vim 进程异常退出,没有自动删除交换文件。此时可执行以下命令:
vim -r .filename.swp # 恢复到文件的最后修改状态 :wq # 保存文件 rm -f .filename.swp # 删除交换文件