默认情况下,vim将交换文件保留在我的项目目录中,崩溃时将保留备份文件。
我可以预防吗?还是我需要更新所有项目的.VCSignore文件?
默认情况下,vim将交换文件保留在我的项目目录中,崩溃时将保留备份文件。
我可以预防吗?还是我需要更新所有项目的.VCSignore文件?
Answers:
默认情况下,Vim不会保留备份文件。它们只是Vim将缓冲区保存到磁盘时存在的临时文件。:help backup-table如此行为所述,可以通过'backup'和'writebackup'选项控制:
'backup' 'writebackup' action ~
off off no backup made
off on backup current file, deleted afterwards (default)
on off delete old backup, backup current file
on on delete old backup, backup current file
对于交换文件,将它们收集在专用目录中可能很有用。可以使用该'directory'选项来完成。例如
:set directory^=$HOME/.vim/tmp//
将添加$HOME/.vim/tmp到Vim在创建交换文件时将尝试使用的目录列表的开头。尾部//使Vim编码文件的整个路径名,因此不会与来自不同目录的名称相似的文件发生冲突。
警告:由于交换文件存储在不同的位置,因此有效地使Vim无法通知多个用户是否试图编辑同一文件。
下面的代码片段(改编自tpope的vimrc)还将在未修改缓冲区时禁用交换文件,因此,如果在打开一堆文件时Vim /您的计算机崩溃了,留下的交换文件将只是用于修改的文件。
autocmd CursorHold,BufWritePost,BufReadPost,BufLeave *
\ if isdirectory(expand("<amatch>:h")) | let &swapfile = &modified | endif
注意:由于交换文件仅在修改缓冲区时才存在,因此其作用与setting类似'directory'。如果缓冲区没有被修改,则另一个Vim可以不经通知就开始对其进行编辑。如果第二个Vim在第一个进行更多更改之前保存,则直到用户尝试保存或某些触发Vim来检查文件是否被修改后,它们才会被注意到。
我.vimrc在多台计算机上使用我的计算机,包括共享服务器。我不一定希望人们能够看到我正在处理的文件,并且我喜欢保持主目录相对干净。所以这是我的解决方案,可以在Linux和Mac OS X上正常工作。
" Sets central temp file location, to prevent local default behavior.
if isdirectory($HOME . '/.vim/.tmp') == 0
:silent !mkdir -m 700 -p ~/.vim/.tmp > /dev/null 2>&1
endif
set backupdir=~/.vim/.tmp ",~/.local/tmp/vim,/var/tmp,/tmp,
set directory=~/.vim/.tmp ",~/.local/tmp/vim,/var/tmp,/tmp,
请注意,这将.tmp在~/.vim不存在的目录下创建一个目录。这将是交换文件的新位置。对于撤消文件,我也有以下内容.vimrc(非常相似):
if exists("+undofile")
" undofile -- This allows you to use undos after exiting and
" restarting. NOTE: only present in 7.3+
" :help undo-persistence
if isdirectory( $HOME . '/.vim/.undo' ) == 0
:silent !mkdir -m 700 -p ~/.vim/.undo > /dev/null 2>&1
endif
set undodir=~/.vim/.undo
set undofile
endif
这是我在vimrc中所做的:
fun! MkdirIfNeeded(dir, flags, permissions)
if !isdirectory(a:dir)
call mkdir(a:dir, a:flags, a:permissions)
endif
endfun
" Set (& create if needed) a temp directory to keep backup & swap files
if has('win32')
let whoami = substitute(system("whoami /LOGONID"), '\n', '', '')
let tmpdir = 'C:/tmp/vim_' . whoami
else
let whoami = substitute(system("whoami"), '\n', '', '')
let tmpdir = '/var/tmp/vim_' . whoami
endif
call MkdirIfNeeded(tmpdir, 'p', 0700)
let &backupdir = tmpdir
let &dir = tmpdir
let &undodir = tmpdir
它将创建/var/tmp/vim_<username>,并使用它来存储所有与vim相关的文件。保持项目目录干净。
使用whoami确保您可以全局使用vimrc(即,用于用户和root),同时仍使用单独的目录;如果不需要它,可以将其替换为硬编码目录,以加快启动速度。您也可以使用~/.vim/目录,但是我喜欢使用目录,/var/tmp因为它通常是一个单独的文件系统。
我使用/var/tmp是因为/tmp经常在重新启动时清除。您可能不希望此目录在世界范围内可写,因为当您打开文件时,人们可以将文件放置在该目录中,以进行可能有害的事情。
adduser用于创建用户的目录中。无论如何,大多数人都在受信任的机器上使用Vim(因此,您的评论很好)。
$HOME某个地方。
/var/是一个不同的文件系统。该理论是,它会防止了很多写的/,/usr或者/home,从而减少碎片和在发生碰撞的情况下,文件损坏的风险。这也是为什么邮箱之类的东西都在/var默认情况下,而不是在homedir ...
/var/tmp始终是可写的,它是系统临时目录。(好吧,您可以将其更改为not not,但这是类Unix系统很乐意让您在破坏它之后保留它们的东西之一)。如果您在系统上还有另一个用户,则他/她可以创建/var/tmp/vim_«your_username»具有自己选择权限的用户。然后用指向重要文件的符号链接填充它,这些文件可能会被vim tempfiles破坏。