vimbook-OPL(14-16)

CH14 文件恢复和命令参数

这一章主要讲将 Vim 如何避免数据丢失方面的功能,包括:文件恢复的命令行参数、加密、批处理脚本以及备份文件选项和交换文件管理等。

14.1 命令行参数

vim --help 显示帮助文档,vim --version 显示版本以及特性选项。vim -R file.txtview file.txt 以只读打开文件。vim -X secret.txt 以加密形式创建文件,Vim 会提示输入密码,只有用 Vim 并且输入对应的密码时才能打开文件,否则将显示乱码。’key’ 选项将密码已明文存储,调用 :X 命令可以星号显示保存的密码。这里有一点值得注意的是 Vim 的加密是很弱的,而且交换文件(swap file)是没有加密的。调用 vim -X -n file.txt 将取消使用交换文件,反面作用是文件恢复功能将失效。

14.2 以脚本形式执行 Vim

这个很简单,将 Vim 脚本写在文件中并重定向到 Vim 中即可。脚本中的命令必须是 EX 命令。如下所示:

:%s/--person--/Jones/g
:write
:quit

将以上内容放置在文件 change.vim 中,然后调用 $vim -es file.txt < change.vim ,此命令的含义在于用 EX 模式在文件 file.txt 上执行 change.vim 中的命令。

14.3 额外的命令行参数

以下命令行参数对调试非常重要:

-Vnumber       显示编辑器的额外信息,当调试 Vim 脚本时非常有用;
-f             将 Vim GUI 作为前台启动,这样可以跟踪到很多信息;
-w script      将用户在 Vim 输入的所有按键都记录到 script 文件中,以 append 形式写入文件;
-W script      跟 -w 一样,只是以 truncat 形式写入文件;
-s script      将 script 中的输入进行回播;

14.4 备份文件

通常 Vim 是不产生备份文件的,如果需要备份文件只需要执行 :set backup 就行,这样每次保存文件时,都会产生一个以 ~ 结尾的备份文件。data.txt 的备份文件就是 data.txt~ 。如果不喜欢这样的备份文件后缀,就用 :set backupext=<string> 来设置扩展名,如:

:set backupext=.bak

这样之后 data.txt 的备份文件就是 data.txt.bak 了。通过设置 ‘patchmode’ 选项可以指定编辑文件为补丁模式,这样当编辑存在的文件时会保留一份旧的原始文件。具体::set patchmode=.org 只有当第一次编辑 data.txt 时,此时还没有创建 data.txt.org 文件,才会保留一个 data.txt.org 的原始内容文件。

通常 Vim 的备份文件会放在原始文件的同一目录,这对版本库和其它编辑者都不友好。好的方式是放到一个其它目录中去,通过设置 :set backupdir=~/tmp/ 可以将备份文件放到 ~/tmp 目录中去。需要注意的一点是如果多个不同目录下的同名文件在备份目录中会有冲突。’backupdir’ 选项不止可以设置一个文件夹,可以用逗号分割多个目录。

14.5 Vim 写入文件的流程

  1. Vim 写入前会检查外部是否改变了文件内容,如果是会提示是否覆盖;
  2. 如果设置了 ‘backup’ 选项,之前的就备份文件将会被移除,当前文件(此时还没有做出改动)复制到备份文件中;
  3. 缓存被写入到文件;
  4. 如果存在 ‘patchmode’ 并且补丁文件不存在,备份文件将被重命名为补丁文件;
  5. 如果没有设置 ‘backup’ 选项,但是设置了 ‘writebackup’ ,备份文件将被删除;

14.6 文件恢复和交换文件

当 Vim 在运行的过程中突然退出,比如:连接关闭、强制关机等,此时 Vim 还保留了交换文件,如果重新打开此文件将会提示是否恢复原来的编辑,最好的办法就是选择恢复(Recover)而不是强制编辑(Edit anyway)。文件恢复并不会删除交换文件,除非手动删除。

另外一种办法是通过 -r 参数来恢复文件,如: vim -r commands.c,如果想要列举所有的交换文件,调用 vim -r 命令得到当前目录和临时目录中的交换文件。通过恢复文件的方式打开 Vim 会得到第二个交换文件,如 .file.txt.swo 区别于第一次打开的 .file.txt.swp ,第三次打开将会参数 .file.txt.swn 依次往后递减字母。为了知道当前使用的是哪个交换文件,用 :swapname 显示。这样做的原因在于 Vim 不想丢失任何一次对文件的编辑,保证数据不丢失。

交换文件的写入频率是可以调优的,选项 ‘updatetime’ 和 ‘updatecount’ 设置更新的时间间隔和输入字符数间隔,如: :set updatetime=23000 设置间隔时间为23s,默认是4s,:set updatecount=400 设置每输入400个字符就写入一次,默认是200,如果设置为 0 将不保存交换文件。为了保存或者不保存交换文件更好的方式是使用 :set swapfile:set noswapfile 来指定,这个选项将在每次编辑文件时重置,所以必须针对每个打开的文件去设置,默认是打开写入交换文件。

写入文件并不一定马上同步到磁盘上,在 UNIX 系统中,写入文件的操作首先提交到操作系统的缓冲区,操作系统将在合适的时机同步到磁盘。可以在 Vim 中使用 :set swapsync 来强制将交换文件同步到磁盘。

设置选项 :set directory=.,/tmp 来指定将交换文件保存到指定的目录,目录可以是以逗号分隔的一列目录。指定目录也要防止多个目录下相同文件的编辑造成交换文件的冲突。

14.7 保存你的工作

写入到文件有两种方式一种是常用的 :w 命令将文件直接写入到文件,另一个是 :preserve 将工作保存到交换文件中去,之后可以用 -r 命令行参数恢复文件或者调用 :recover file.txt 恢复。:preserve 命令的好处在于即便原文件丢失,也能够恢复此文件。

CH15 非规约命令

一些有用但是没有特定主题的命令。在终端中,我们需要切出到 Vim 的外面来做一些操作,用 CTRL-Z 可以将 Vim 悬挂起来。当想返回时,调用 fg 命令即可。

有时候我们想要再次看下 Vim 的介绍页面,调用 :intro 命令即可。

Vim 是可以阅读 man page 的,但是呢 man page 的下划线是 [ascii] 字符,需要用 ul -i 命令转义掉。用 pipe 串起来就是 man date | ul -i | vim - ,此时会发现所有的下划线都变成了感叹号。还有另外一个方式,就是 man date | vim - 打开对应的 man page 之后,调用 Vim 的 :%s/.\b//g\b 以及其前的字符干掉,这样就可以形成一个可读的文本了。

Leave a Reply

Your email address will not be published. Required fields are marked *