默认情况下,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破坏。