Comment puis-je empêcher Vim de laisser trop de fichiers (comme l'échange, la sauvegarde, l'annulation)?

13

Par défaut, vimlaisse les fichiers d'échange dans mon répertoire de projet, et en cas de panne, il laisse des fichiers de sauvegarde.

Puis-je empêcher cela? Ou dois-je mettre à jour le .VCSignorefichier de tous mes projets ?

Martin Tournoij
la source

Réponses:

16

Fichiers de sauvegarde

Par défaut, Vim ne laisse pas de fichiers de sauvegarde derrière. Ce sont simplement des fichiers transitoires qui existent pendant que Vim enregistre le tampon sur le disque. Comme décrit dans :help backup-tablece comportement, vous pouvez contrôler les options 'backup'et '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

Échanger des fichiers

Quant aux fichiers d'échange, il peut être utile de les collecter dans un répertoire dédié. Cela peut être fait avec l' 'directory'option. Par exemple

:set directory^=$HOME/.vim/tmp//

ajoutera $HOME/.vim/tmpen tête de la liste des répertoires que Vim tentera d'utiliser lors de la création d'un fichier d'échange. La fin //fait que Vim code le nom complet du chemin vers le fichier afin qu'il n'y ait pas de collisions avec des fichiers de noms similaires provenant de différents répertoires.

Avertissement : cela désactive efficacement la possibilité pour Vim de remarquer si plusieurs utilisateurs tentent de modifier le même fichier car les fichiers d'échange sont stockés dans des emplacements différents.

L'extrait ci-dessous (adapté du vimrc de tpope ) désactivera également le fichier d'échange pour un tampon lorsqu'il n'est pas modifié, de cette façon si Vim / votre ordinateur se bloque lorsque vous avez un tas de fichiers ouverts, les fichiers d'échange laissés derrière ne seront que pour les fichiers modifiés.

autocmd CursorHold,BufWritePost,BufReadPost,BufLeave *
  \ if isdirectory(expand("<amatch>:h")) | let &swapfile = &modified | endif

Avertissement : étant donné que le fichier d'échange n'existe que lorsque le tampon est modifié, cela a un effet similaire à celui du paramètre 'directory'. Si le tampon n'est pas modifié, un autre Vim peut commencer à le modifier sans préavis. Si le deuxième Vim enregistre avant que le premier n'effectue plus de modifications, alors elles ne seront pas remarquées jusqu'à ce que l'utilisateur essaie d'enregistrer ou quelque chose déclenche Vim pour vérifier si le fichier est modifié.

jamessan
la source
5

J'utilise mon .vimrcsur plusieurs machines, y compris les serveurs partagés. Je ne veux pas nécessairement que les gens puissent voir les fichiers sur lesquels je travaille et j'aime garder mon répertoire personnel relativement propre. C'est donc ma solution qui fonctionnera très bien sur Linux et 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,

Notez que cela créera un .tmprépertoire sous ~/.vims'il n'existe pas déjà. Ce serait la nouvelle maison de vos fichiers d'échange. Pour les fichiers d'annulation, j'ai également les éléments suivants dans mon .vimrc(qui est assez similaire):

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
HAL 9001
la source
1

Voici ce que je fais dans mon 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

Il créera /var/tmp/vim_<username>et utilisera ceci pour stocker tous les fichiers liés à vim. Garder votre répertoire de projet propre.

L'utilisation whoamigarantit que vous pouvez utiliser le vimrc globalement (c'est-à-dire pour l'utilisateur & root) tout en utilisant des répertoires séparés; si vous n'en avez pas besoin, vous pouvez le remplacer par un répertoire codé en dur pour un démarrage plus rapide. Vous pouvez également utiliser le ~/.vim/répertoire, mais j'aime l'utiliser /var/tmpcar il s'agit généralement d'un système de fichiers séparé.

J'utilise /var/tmpcar /tmpest souvent effacé au redémarrage. Vous ne voulez probablement pas que ce répertoire soit accessible en écriture, car les gens pourraient alors y placer des fichiers pour faire des choses potentiellement dangereuses lorsque vous ouvrez un fichier.

Martin Tournoij
la source
1
/var/tmpest toujours accessible en écriture, c'est un répertoire temporaire du système. (Eh bien, vous pouvez le changer pour ne pas l'être, mais c'est l'une de ces choses où les systèmes de type Unix sont heureux de vous laisser garder les morceaux après l'avoir cassé). Si vous avez un autre utilisateur sur le système, il / elle pourrait créer /var/tmp/vim_«your_username»avec les autorisations de son choix. Et puis remplissez-le avec des liens symboliques vers vos fichiers importants, qui seront probablement détruits par les fichiers temporaires vim.
derobert
@derobert Uniquement s'il n'existe pas. Si vous utilisez ce système et que vous avez beaucoup d'utilisateurs, vous souhaiterez probablement ajouter la création de ce répertoire adduserou tout ce que vous utilisez pour créer des utilisateurs. Dans tous les cas, la plupart des gens utilisent Vim sur des machines de confiance (mais votre commentaire est bon en tant que tel).
Martin Tournoij
Correct, seulement s'il n'existe pas. Ce qui, étant dans un répertoire temporaire du système, se produit de façon imprévisible en fonction du moment où ces fichiers temporaires sont nettoyés. Je ne sais pas pourquoi vous ne le mettez pas $HOMEquelque part.
derobert
@derobert Eh bien, /var/c'est un système de fichiers différent. La théorie est que cela empêchera beaucoup d'écritures sur /, /usrou /home, conduisant à moins de fragmentation et de risque de corruption de fichiers en cas de plantage ... C'est aussi pourquoi les boîtes aux lettres et les trucs sont activés /varpar défaut, et non dans le homedir ...
Martin Tournoij