文章目录
参考
项目 | 描述 |
---|---|
Vim 官方文档 | 从崩溃中恢复 |
YYQ | VIM学习笔记 交换文件(swap) |
搜索引擎 | Bing |
描述
项目 | 描述 |
---|---|
操作系统 | Ubuntu 22.04.2 LTS(64 位) |
Vim | 8.2 |
交换文件
在使用 Vim 编辑文件的过程中,Vim 将自动创建交换文件(交换文件可理解为源文件在某一时间段的副本)。交换文件在用户从 Vim 编辑器中正常退出后将被自动删除。而当用户未正常退出 Vim 时(计算机的突然关机、与 Vim 相关的终端突然关闭及 Vim 进程的突然关闭等事件),交换文件将保留在计算机中,等待用户使用其进行文件的恢复。
产生交换文件
为产生交换文件,我们可以在使用 Vim 编辑器编辑文本的过程中,不通过 :wq 等命令进行 Vim 编辑器的正常退出,直接关闭相关的终端窗口或标签页。
在完成上述操作后,在被编辑文件所在的目录中(在非一般的情况下,也可能存在于其他目录中)的交换文件将不会被 Vim 清除。
查看当前编辑文件使用的交换文件的名称
在 Vim 编辑器中使用如下命令,你将能够查看当前编辑文件使用的交换文件的名称。
:swapname
# 或
:sw
查看交换文件
交换文件在 Linux 系统下以 . 作为文件名称的前缀,这意味着交换文件是一个隐藏文件。在终端中我们可以使用如下命令进行查看(请先将当前工作目录切换至交换文件所在的目录中):
ls -a
其中:
-a 选项表明我们需要查看当前工作目录下的包括隐藏文件在内的所有文件(夹)。
交换文件的存放路径
交换文件默认存放在当前编辑的文件所处的目录之下。你可以通过使用 dir[ectory] 选项来对交换文件的存放地点进行修改。在修改过程中,你可以使用 英式逗号 对多个路径进行分割。存放交换文件时将从 dir[rectory] 选项提供的由逗号分割的多个路径中依次从左往右选择(在正常情况下,将使用第一个路径作为存放地点)合适的目录存放。
默认的存放路径
在 Vim 中使用命令 :set dir 或 :set directory 你将获得此时该选项所提供的值。若在此前你未对改选项进行修改,那么你将获得该选项的默认值。对此,请参考如下示例:
- 在 Vim 中使用命令 :set dir 。
- 敲击回车键 Enter 。
- 观察结果
由此,我们得到了 Vim 为我们提供的 dir[ectory] 选项的默认值:
directory=.,~/tmp,/var/tmp,/tmp
设置交换文件的存放路径
通过在命令中使用赋值符号 = ,我们能够对选项进行赋值。例如我们可以使用如下语句将 dir[rectory] 选项的值修改为 /home/redheart/tmp 。
set dir=/home/redheart/tmp
# 或
set directory=/home/redheart/tmp
在修改后,我们可以使用 :set dir 或 :set directory 查看 dir[ectory] 选项是否已被更改。
注:
使用 set 命令对选项进行修改时,赋值符号两边不可留有空白字符(如空格)。否则,Vim 将抛出错误。
交换文件的产生
频率
在您录入 200 个字符后或者 4 秒 内没有录入任何字符时,交换文件会被更新。只有在缓
冲区被修改的情况下,才会有这样的更新,仅仅移动光标是不会更新交换文件的。为什么
不进行实时的更新?原因在于这样频繁的更新会极大的拖慢其他正常工作的速度。
上述内容引用自 Vim 中文官方文档
在默认情况下,在您录入 200 个字符后或者 4 秒 内没有录入任何字符时,交换文件才会被更新。如果你需要对这一设定进行更改,可以修改 updatetime 及 updatecount 选项。
举个栗子
设置 updatetime 选项的值为 4.5 秒。为此,请先进入 Vim 编辑器中并执行如下命令:
:set updatetime=4500
注:
- updatetime 的值以毫秒为单位,这意味着 updatetime 选项的默认值为 4000。
- 除了由 Vim 自动将修改写入交换文件,你还可以自己主动的将修改写入交换文件。使用命令 :pre 或 :preserve 可以做到这一点。
后缀
同一目录下可以存在同一文件的多份交换文件,交换文件的后缀是区分这些交换文件的一种方法。
某一文件所产生的第一份交换文件的后缀为 .swp(swp 是 swap 的简写)。在第一份交换文件产生后,以后每次产生的交换文件(交换文件已存在于存放路径中。在使用 Vim 编辑过程中若再次发生意外将产生新的交换文件)的后缀都将按照一定的规则进行变化。规则大致如下 :
如果扩展名是 “.swp” 的文件已经存在,逐次递减最后的字母,直到找到没有现
存文件的名字为止。如果过了 “.saa” 还找不到,不建立交换文件。
上述内容引用自 Vim 中文官方文档
解读
-
搜索已存在的交换文件
在新的交换文件产生时(新的交换文件对应的源文件已产生后缀为 .swp 的交换文件),Vim 将搜索存放交换文件的路径中已存在的交换文件。 通过使 .swp 末两未字母发生变化(第三位字母按照字母表顺序 依次 减小。当第三位字母减小至 a 时,第三位字母将跳转至 z,第二位字母将自减为字母表中的前一位字母。)来匹配存放交换文件中的路径中的文件(文件名称及后缀相同的文件)。 -
偏移
当某一变化与存放交换文件的路径中的交换文件发生匹配时,以该文件的文件名为基础进行偏移操作:
将文件后缀中的最后一位字母自减为字母表中的前一位字母。若自减前该字母为 a ,则最后一位字母需要跳转至 z ,倒数第二位字母将自减为字母表中的前一位字母。 -
创建交换文件
以文件后缀发生偏移操作的文件名作为新的交换文件的文件名创建交换文件。
举个栗子
-
若交换文件的存放路径下未存在任何交换文件,则在使用 Vim 编辑文件的过程中将产生后缀为 .swp 的交换文件。
-
若交换文件的存放路径下 匹配到 (而非存在)后缀为 .swp 的交换文件,则在使用 Vim 编辑文件的过程中将产生后缀为 .swo 的交换文件。
-
若交换文件的存放路径下 匹配到 (而非存在)后缀为 .swa 的交换文件,则在使用 Vim 编辑文件的过程中将产生后缀为 .svz 的交换文件。
-
若交换文件的存放路径下 匹配到 (而非存在)后缀为 .saa 的交换文件,则在使用 Vim 编辑文件的过程中将不产生交换文件。
再举个栗子
为了更深刻的理解上一个栗子中出现的如下句子的含义,我准备了另一个示例。
匹配到 (而非存在)
- 检索当前路径下的所有文件。
ls -a
执行结果
. hello .hello.swg .hello.swi .hello.swk .hello.swm .hello.swo
.. .hello.swf .hello.swh .hello.swj .hello.swl .hello.swn .hello.swp
- 使用命令删除文件 .hello.swh
sudo rm .hello.swh
- 使用 Vim 编辑 hello 文件并非正常地退出 Vim 编辑器以创建新的交换文件。
- 检索当前路径下的所有文件。
ls -a
执行结果
. hello .hello.swf .hello.swh .hello.swj .hello.swl .hello.swn .hello.swp
.. .hello.swe .hello.swg .hello.swi .hello.swk .hello.swm .hello.swo
结果表明,创建的新的交换文件的名称为 .hello.swh 而非 .hello.swe 。
交换文件的检索
在终端中使用 Vim 命令将能够列出交换文件的存放路径中出现的交换文件。
vim -r
# 或
vim -L
注:
使用该命令对交换文件进行检索时,采用的规则与创建交换文件时所采用的的命名规则类似。大致规则如下:
- 查找某一存放路径中是否存在以 .swp 为后缀的文件。若有则执行第二步操作;若无则检索其他存放路径。
- 通过使 .swp 末两未字母发生变化(第三位字母按照字母表顺序 依次 减小。当第三位字母减小至 a 时,第三位字母将跳转至 z,第二位字母将自减为字母表中的前一位字母。)来匹配存放交换文件中的路径中的文件的后缀。
- 若存在匹配的文件则将其放入检索列表中。
举个栗子
- 检索当前路径下的所有文件。
ls -a
执行结果
. .. hello .hello.svz
- 实行交换文件的检索操作
vim -L
检索结果
找到交换文件:
位于当前目录:
-- 无 --
位于目录 ~/tmp:
-- 无 --
位于目录 /var/tmp:
-- 无 --
位于目录 /tmp:
-- 无 --
交换文件产生的条件
交换文件产生的条件
- Vim 编辑器使用 swapfile 选项,而非 noswapfile 选项。
- updatecount 选项的值不为零。
在上述两种条件中的任意一条不被满足时,将不会产生交换文件。
swapfile 与 noswapfile
Vim 编辑器默认使用的是 swapfile 选项,如果你需要使用 noswapfile 选项,可以使用如下命令:
:set noswapfile
注:
- 若在使用 :set swapfile 时,updatecount 的选项值不为零,那么 Vim 将立即创建交换文件。
- 若在使用 :set noswapfile 时,源文件已创建了 一个正在使用的交换文件,那么该交换文件将被删除。
updatecount
updatecount 的值由零转换为非零或由非零转换为零时,并不会像 swapfile 与 noswapfile 那般,立即导致交换文件的立即创建或立即删除。
使用 -n 选项拒绝使用交换文件
使用 Vim 编辑文件时,可以使用 -n 选项拒绝使用交换文件。
vim -n 被编辑文件的路径
-n 选项的内部原理
在使用 -n 选项打开文件的同时,将 updatecount 选项的值设置为零。因此,在使用 -n 选项打开被编辑文件后,若希望产生相应的交换文件,仅需要将 updatecount 选项的值设置为零即可。
文件的恢复
在存在交换文件时,我们可以通过使用交换文件来恢复文件中的内容。
Vim
在使用 Vim 打开文件时,若 Vim 检测到交换文件的存放路径中存在相应的交换文件,将会弹出与如下内容类似的信息。
在出现该信息后,输入 R 或 r 将通过以 .swp 结尾的对应的交换文件进行文件的恢复。
注:
使用该方法无法指定使用的交换文件,这意味着使用该方法,您仅能使用 .swp 文件结尾的对应的交换文件进行文件的恢复。
使用 -r 选项
通过使用 vim 命令的 -r 选项,你可以使用交换文件来对文件进行恢复。
-r 选项接受两种参数,一为交换文件(Vim 将使用该交换文件进行文件的复原)的路径,二为需要使用交换文件(以 .swp 结尾的对应的交换文件)进行恢复操作的文件。
举个栗子
- 使用如下命令以通过 .swp 结尾的对应的交换文件进行 hello 文件的恢复。
vim -r hello
- 使用如下命令以通过 交换文件 .hello.swa 复原文件。
vim -r .hello.swa
recover 命令
在使用 Vim 打开需要使用交换文件进行恢复的文件后,执行 :recover 或 :rec 命令以进行文件的恢复。使用命令后,Vim 将从交换文件存放的路径中检索交换文件并在 Vim 中进行展示。
通过选择交换文件名称前的编号,你将能够使用指定的交换文件进行文件的恢复。
删除交换文件
在使用交换文件恢复文件后,交换文件并不会被自动删除。如果交换文件对你已经没有用处,那么你可以手动将其进行删除。
敏感文件
在使用 Vim 进行文件的编辑时,可能会产生交换文件。若在将文件部署到服务器中,将导致信息的泄露。