Como posso impedir que o Vim deixe muitos arquivos (como troca, backup, desfazer)?

13

Por padrão, vimdeixa os arquivos de troca no diretório do meu projeto e, em caso de falha, os arquivos de backup.

Posso impedir isso? Ou preciso atualizar o .VCSignorearquivo de todos os meus projetos ?

Martin Tournoij
fonte

Respostas:

16

Arquivos de backup

Por padrão, o Vim não deixa arquivos de backup para trás. Eles são meramente arquivos transitórios que existem enquanto o Vim está salvando o buffer no disco. Conforme descrito :help backup-tableneste comportamento, pode ser controlado pelas opções 'backup'e '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

Trocar arquivos

Quanto aos arquivos de troca, pode ser útil coletá-los em um diretório dedicado. Isso pode ser feito com a 'directory'opção Por exemplo

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

adicionará $HOME/.vim/tmpao cabeçalho da lista de diretórios que o Vim tentará usar ao criar um arquivo de troca. A //trilha faz com que o Vim codifique o nome completo do caminho para o arquivo, para que não haja colisões com arquivos com nomes semelhantes de diretórios diferentes.

Advertência : Isso desativa efetivamente a capacidade do Vim perceber se vários usuários estão tentando editar o mesmo arquivo, pois os arquivos de troca são armazenados em locais diferentes.

O snippet abaixo (adaptado do vimrc do tpope ) também desabilitará o arquivo de troca para um buffer quando não for modificado, assim, se o Vim / seu computador travar quando você tiver vários arquivos abertos, os arquivos de troca deixados para trás serão apenas para arquivos modificados.

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

Advertência : Como o arquivo de troca existe apenas quando o buffer é modificado, isso tem um efeito semelhante ao da configuração 'directory'. Se o buffer não for modificado, outro Vim poderá começar a editá-lo sem aviso prévio. Se o segundo Vim salvar antes que o primeiro faça mais alterações, elas não serão notadas até que o usuário tente salvar ou algo acione o Vim para verificar se o arquivo foi modificado.

jamessan
fonte
5

Eu uso o meu .vimrcem várias máquinas, incluindo servidores compartilhados. Não quero necessariamente que as pessoas possam ver os arquivos nos quais estou trabalhando e gosto de manter meu diretório pessoal relativamente limpo. Portanto, esta é a minha solução que funcionará perfeitamente no Linux e 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,

Observe que isso criará um .tmpdiretório ~/.vimse ele ainda não existir. Essa seria a nova página inicial dos seus arquivos de troca. Para desfazer arquivos, também tenho o seguinte no meu .vimrc(que é bastante semelhante):

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
fonte
1

Isto é o que eu faço no meu 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

Ele criará /var/tmp/vim_<username>e usará isso para armazenar todos os arquivos relacionados ao vim. Mantendo o diretório do projeto limpo.

O uso whoamigarante que você possa usar o vimrc globalmente (ou seja, para o usuário e raiz) enquanto ainda estiver usando diretórios separados; se você não precisar disso, poderá substituí-lo por um diretório codificado para uma inicialização mais rápida. Você também pode usar o ~/.vim/diretório, mas eu gosto de usá- /var/tmplo porque geralmente é um sistema de arquivos separado.

Eu uso /var/tmpporque /tmpé frequentemente limpo na reinicialização. Você provavelmente não deseja que este diretório seja gravável em todo o mundo, pois as pessoas podem colocar arquivos lá para fazer coisas potencialmente perigosas quando você abre um arquivo.

Martin Tournoij
fonte
1
/var/tmpé sempre gravável no mundo - é um diretório temporário do sistema. (Bem, você pode mudar para não ser, mas é uma daquelas coisas em que sistemas semelhantes ao Unix ficam felizes em deixar você manter as peças depois de quebrá-lo). Se você tiver outro usuário no sistema, ele poderá criar /var/tmp/vim_«your_username»com permissões de sua escolha. E, em seguida, preencha-o com links simbólicos para seus arquivos importantes, que provavelmente serão destruídos pelos arquivos temporários do vim.
derobert
@derobert Apenas se não existir. Se você usa esse sistema e possui muitos usuários, provavelmente deseja adicionar a criação deste diretório adduserou o que quer que esteja usando para criar usuários. De qualquer forma, a maioria das pessoas usa o Vim em máquinas confiáveis ​​(mas seu comentário é bom, como tal).
Martin Tournoij 03/02
Correto, apenas se não existir. O qual, estando em um diretório temporário do sistema, acontece imprevisivelmente com base em quando esses arquivos temporários são limpos. Não sei por que você não o coloca em $HOMEalgum lugar.
derobert
@derobert Bem, /var/é um sistema de arquivos diferente. A teoria é que ele vai evitar uma série de gravações em /, /usrou /home, levando a uma menor fragmentação e risco de corrupção de arquivo em caso de um acidente ... É também por isso caixas de correio e outras coisas estão em /varpor padrão, e não no homedir ...
Martin Tournoij