默认情况下,vim将交换文件留在我的项目目录中,崩溃时会保留备份文件。

我可以防止这种情况吗?还是我需要更新我所有项目的.VCSignore文件?

#1 楼

备份文件

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


:由于交换文件仅在修改缓冲区时存在,因此其效果与设置'directory'相似。如果缓冲区未被修改,则另一个Vim可以不经通知就开始对其进行编辑。如果第二个Vim在第一个进行更多更改之前保存,那么直到用户尝试保存或某些触发Vim来检查文件是否被修改后,它们才会被注意到。

#2 楼

我在多台计算机(包括共享服务器)上使用我的.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


#3 楼

这是我在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通常在重新启动时被清除。您可能不希望此目录在世界范围内写入,因为当您打开文件时,人们可以将文件放在那里,以做可能有害的事情。

评论


/ var / tmp始终是世界可写的-它是系统临时目录。 (好吧,您可以将其更改为not not,但这是类Unix系统很乐意让您在破坏它之后保留它们的东西之一)。如果您在系统上还有其他用户,则他/她可以使用自己选择的权限创建/ var / tmp / vim_«您的用户名»。然后用指向重要文件的符号链接填充它,这些文件可能会被vim tempfiles破坏。

–德罗伯特
15年2月3日,17:51

@derobert仅当它不存在时。如果您在整个系统范围内使用并且有很多用户,则可能要将此目录的创建添加到adduser或用来创建用户的任何目录。无论如何,大多数人都在受信任的机器上使用Vim(因此,您的评论很好)。

–马丁·图尔诺伊(Martin Tournoij)
15年2月3日,17:56

正确,仅当它不存在时。根据清除临时文件的时间,它们在系统临时目录中的发生是不可预测的。不知道为什么不将其放在$ HOME中。

–德罗伯特
15年2月3日在17:59

@derobert好吧,/ var /是一个不同的文件系统。从理论上讲,它将防止在/,/ usr或/ home上进行大量写操作,从而减少碎片和文件崩溃的风险(如果发生崩溃的话)...这也是为什么邮箱和内容位于/ var默认情况下,不在homedir中...

–马丁·图尔诺伊(Martin Tournoij)
15年2月3日在18:07