Vim

临时文件

根据选项的不同, VIM 最多会创建 4 种工作文件。

备份文件

你可以让 VIM 在将修改写入到文件之前先备份原文件。默认情况下, VIM 会保存一个备份文件但是当修改成功写入后会立即删除它(:set writebackup)。如果你想一直保留这个备份文件的话,可以使用 :set backup。而如果你想禁用备份功能的话,可以使用 :set nobackup nowritebackup。咱们来看一下上次我在 vimrc 中改了什么:

$ diff ~/.vim/vimrc ~/.vim/files/backup/vimrc-vimbackup
390d389
< command! -bar -nargs=* -complete=help H helpgrep <args>

帮助文档::h backup

交换文件

假设你有一个非常棒的科幻小说的构思。在按照故事情节已经写了好几个小时几十万字的时候..忽然停电了!而那时你才想起来你上次保存 ~/来自外太空的邪恶入侵者.txt 是在.. 好吧,你从来没有保存过。

但是并非没有希望了!在编辑某个文件的时候, VIM 会创建一个交换文件,里面保存的是对当前文件所有未保存的修改。自己试一下,打开任意的文件,并使用 :swapname 获得当前的交换文件的保存路径。你也可以将 :set noswapfile 加入到 vimrc 中来禁用交换文件。

默认情况下,交换文件会自动保存在被编辑文件所在的目录下,文件名以 .file.swp 后缀结尾,每当你修改了超过 200 个字符或是在之前 4 秒内没有任何动作时更新它的内容,在你不再编辑这个文件的时候会被删除。你可以自己修改这些数字,详见::h 'updatecount':h 'updatetime'

而在断电时,交换文件并不会被删除。当你再次打开 vim ~/来自外太空的邪恶入侵者.txt 时, VIM 会提示你恢复这个文件。

帮助文档::h swap-file:h usr_11

撤销文件

内容变更历史记录 是保存在内存中的,并且会在 VIM 退出时清空。如果你想让它持久化到磁盘中,可以设置 :set undofile。这会把文件 ~/foo.c 的撤销文件保存在 ~/foo.c.un~。帮助文档::h 'undofile':h undo-persistence

viminfo 文件

备份文件、交换文件和撤销文件都是与文本状态相关的,而 viminfo 文件是用来保存在 VIM 退出时可能会丢失的其它的信息的。包括历史记录(命令历史、搜索历史、输入历史)、寄存器内容、标注、缓冲区列表、全局变量等等。默认情况下,viminfo 被保存在 ~/.viminfo。帮助文档::h viminfo:h 'viminfo'

临时文件管理设置示例

如果你跟我一样,也喜欢把这些文件放到一个位置(如:~/.vim/files)的话,可以使用下面的配置:

" 如果文件夹不存在,则新建文件夹
if !isdirectory($HOME.'/.vim/files') && exists('*mkdir')
  call mkdir($HOME.'/.vim/files')
endif
" 备份文件
set backup
set backupdir   =$HOME/.vim/files/backup/
set backupext   =-vimbackup
set backupskip  =
" 交换文件
set directory   =$HOME/.vim/files/swap//
set updatecount =100
" 撤销文件
set undofile
set undodir     =$HOME/.vim/files/undo/
" viminfo 文件
set viminfo     ='100,n$HOME/.vim/files/info/viminfo

注意:如果你在一个多用户系统中编辑某个文件时, VIM 提示你交换文件已经存在的话,可能是因为有其他的用户此时正在编辑这个文件。而如果将交换文件放到自己的 home 目录的话,这个功能就失效了。因此服务器非常不建议将这些文件修改到 HOME 目录,避免多人同时编辑一个文件,却没有任何警告。