如何防止Vim留下太多文件(如交换,备份,撤消)?


Answers:


16

备份文件

默认情况下,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来检查文件是否被修改后,它们才会被注意到。


5

.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

1

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


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

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

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

@derobert嗯,/var/是一个不同的文件系统。该理论是,它会防止了很多写的//usr或者/home,从而减少碎片和在发生碰撞的情况下,文件损坏的风险。这也是为什么邮箱之类的东西都在/var默认情况下,而不是在homedir ...
马丁·图尔诺伊
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.