Como controle como o Emacs cria arquivos de backup?

326

O Emacs coloca arquivos de backup com foo~todos os nomes e não gosto de me lembrar de excluí-los. Além disso, se eu editar um arquivo que tenha um link físico em outro lugar do sistema de arquivos, o link físico apontará para o backup quando eu terminar de editar, e isso é confuso e horrível. Como posso eliminar esses arquivos de backup ou fazê-los ir para outro lugar que não seja o mesmo diretório?

jfm3
fonte

Respostas:

518

Se você já foi salvo por um arquivo de backup do Emacs, provavelmente desejará mais deles, e não menos. É irritante que eles entrem no mesmo diretório que o arquivo que você está editando, mas isso é fácil de alterar. Você pode fazer com que todos os arquivos de backup entrem em um diretório, colocando algo como o seguinte em seu .emacs.

(setq backup-directory-alist `(("." . "~/.saves")))

Há vários detalhes misteriosos associados à forma como o Emacs pode criar seus arquivos de backup. Ele deve renomear o original e gravar o buffer editado? E se o original estiver vinculado? Em geral, a aposta mais segura, porém mais lenta, é sempre fazer backups copiando.

(setq backup-by-copying t)

Se isso for muito lento por algum motivo, você também pode dar uma olhada backup-by-copying-when-linked.

Como seus backups estão todos em seu lugar agora, você pode querer mais deles, em vez de menos deles. Dê uma olhada na documentação do Emacs para essas variáveis ​​(com C-h v).

(setq delete-old-versions t
  kept-new-versions 6
  kept-old-versions 2
  version-control t)

Por fim, se você absolutamente não deve ter arquivos de backup:

(setq make-backup-files nil)

Isso me deixa doente de pensar nisso.

jfm3
fonte
6
hey, mas é a criação de backups com um nome como este para casa svradmin foo ~ e não posso abrir o arquivo!
Jaime Hablutzel
33
por que usar backups? por que não usar git / mercurial? bons sistemas de controle de versão e metodologias de programação deve fazer backup trunfo arquivo individual pelo editor
vol7ron
52
@ vol7ron: Os backups são para quando você está editando algo que não está sob controle de versão - como um arquivo de configuração ou algo rápido e sujo que você ainda não colocou no controle de versão ainda. Então, quando você não estiver fazendo o que deveria, o editor salvará seu pescoço.
Eponymous
69
@ vol7ron - Isso é errado. Você não deve colocar porcaria no controle de revisão que não deseja manter. Isso apenas torna mais difícil encontrar as coisas importantes. Em vez disso, use os backups do editor para o que eles servem (backup de alterações em caso de emergência) e controle de revisão para o que é bom (manter versões importantes do seu software e facilitar o desenvolvimento da equipe). Use a ferramenta certa para o trabalho.
TED
26
"Os arquivos de backup acrescentam muita sobrecarga e quase nenhum valor": não é esse julgamento?
Variável miserável
70

Os arquivos de backup / salvamento automático do Emacs podem ser muito úteis. Mas esses recursos são confusos.

Arquivos de backup

Os arquivos de backup têm tildes ( ~ou ~9~) no final e devem ser gravados no diretório inicial do usuário. Quando make-backup-filesnão é nulo, o Emacs cria automaticamente um backup do arquivo original na primeira vez em que o arquivo é salvo de um buffer. Se você estiver editando um novo arquivo, o Emacs criará um backup na segunda vez que você salvar o arquivo.

Não importa quantas vezes você salve o arquivo, o backup permanecerá inalterado. Se você matar o buffer e depois visitar o arquivo novamente, ou na próxima vez em que iniciar uma nova sessão do Emacs, um novo arquivo de backup será criado. O novo backup reflete o conteúdo do arquivo após a reabertura ou no início das sessões de edição. Mas um backup existente nunca é tocado novamente. Portanto, acho útil criar backups numerados (consulte a configuração abaixo).

Para criar backups, use explicitamente save-buffer( C-x C-s) com argumentos de prefixo.

diff-backupe dired-diff-backupcompara um arquivo com seu backup ou vice-versa. Mas não há função para restaurar arquivos de backup. Por exemplo, no Windows, para restaurar um arquivo de backup

C:\Users\USERNAME\.emacs.d\backups\!drive_c!Users!USERNAME!.emacs.el.~7~

deve ser copiado manualmente como

C:\Users\USERNAME\.emacs.el

Salvar arquivos automaticamente

Os arquivos de salvamento automático usam hashmarks ( #) e devem ser gravados localmente no diretório do projeto (junto com os arquivos reais). O motivo é que os arquivos de salvamento automático são apenas arquivos temporários criados pelo Emacs até que um arquivo seja salvo novamente (como com apressada obediência).

  • Antes que o usuário pressione C-x C-s( save-buffer) para salvar um arquivo, o Emacs salva automaticamente os arquivos - com base na contagem de pressionamentos de tecla ( auto-save-interval) ou quando você para de digitar ( auto-save-timeout).
  • O Emacs também salva automaticamente sempre que falha, incluindo a interrupção do trabalho do Emacs com um comando shell.

Quando o usuário salva o arquivo, a versão salva automaticamente é excluída. Mas quando o usuário sai do arquivo sem salvá-lo, o Emacs ou a sessão X travam, os arquivos salvos automaticamente ainda existem.

Use revert-bufferou recover-filepara restaurar arquivos de salvamento automático. Observe que o Emacs registra sessões interrompidas para recuperação posterior em arquivos denominados ~ / .emacs.d / auto-save-list . A recover-sessionfunção usará essas informações.

O método preferido para recuperar de um arquivo salvo automaticamente é M-x revert-buffer RET. O Emacs perguntará: "O buffer foi salvo automaticamente recentemente. Reverter do arquivo de salvamento automático?" ou "Reverter buffer do arquivo FILENAME?". No caso deste último, não há arquivo de salvamento automático. Por exemplo, porque você salvou antes de digitar outras auto-save-intervallteclas, nesse caso o Emacs excluiu o arquivo de salvamento automático.

Atualmente, o salvamento automático está desativado por padrão, pois pode retardar a edição quando conectado a uma máquina lenta e porque muitos arquivos contêm dados confidenciais.

Configuração

Aqui está uma configuração que IMHO funciona melhor:

(defvar --backup-directory (concat user-emacs-directory "backups"))
(if (not (file-exists-p --backup-directory))
        (make-directory --backup-directory t))
(setq backup-directory-alist `(("." . ,--backup-directory)))
(setq make-backup-files t               ; backup of a file the first time it is saved.
      backup-by-copying t               ; don't clobber symlinks
      version-control t                 ; version numbers for backup files
      delete-old-versions t             ; delete excess backup files silently
      delete-by-moving-to-trash t
      kept-old-versions 6               ; oldest versions to keep when a new numbered backup is made (default: 2)
      kept-new-versions 9               ; newest versions to keep when a new numbered backup is made (default: 2)
      auto-save-default t               ; auto-save every buffer that visits a file
      auto-save-timeout 20              ; number of seconds idle time before auto-save (default: 30)
      auto-save-interval 200            ; number of keystrokes between auto-saves (default: 300)
      )

Dados sensíveis

Outro problema é que você não deseja que o Emacs espalhe cópias de arquivos com dados confidenciais. Use esse modo por arquivo. Como este é um modo menor, para os meus propósitos, eu o renomei sensitive-minor-mode.

Para habilitá-lo para todos os arquivos .vcf e .gpg , no seu .emacs use algo como:

(setq auto-mode-alist
      (append
       (list
        '("\\.\\(vcf\\|gpg\\)$" . sensitive-minor-mode)
        )
       auto-mode-alist))

Como alternativa, para proteger apenas alguns arquivos, como alguns arquivos .txt , use uma linha como

// -*-mode:asciidoc; mode:sensitive-minor; fill-column:132-*-

no arquivo

Andreas Spindler
fonte
Então você não usa o salvamento automático? Essas configurações permitem evitar a visualização desses arquivos desagradáveis ​​# filename.tex # na sua pasta?
precisa saber é o seguinte
3
Eu sempre uso os arquivos de salvamento automático e de backup por padrão, exceto para arquivos com dados confidenciais. O modo sensível desabilita o salvamento automático e os backups. Aliás, arquivos # file.ext # não são realmente desagradáveis, porque o Emacs os cria e os exclui conforme necessário. Se eles permanecerem, o Emacs ainda está em execução ou são um artefato de um Emacs com falha. Em ambos os casos, eles podem salvar o dia ;-)
Andreas Spindler
Ah, obrigado por essa informação extra. Na verdade, tenho uma experiência positiva principalmente com eles (eles salvaram meu dia). Somente quando você está procurando feiúra, bem, você tem razão lá :)
PascalVKooten
BTW, uma coisa é fazer backups e outra coisa é restaurar backups. Portanto, brinque com o salvamento automático. Mate o trabalho Emacs ou a sessão ssh. Se houver um arquivo de salvamento automático, diffele com o arquivo real. Em seguida, atire no Emacs e descubra por si mesmo o que revert-bufferfaz. Isso será recompensado rapidamente em casos de emergência.
Andreas Spindler
O modo sensível funciona muito bem. Obrigado. Observe que na sua postagem você o chama de modo menor sensível, enquanto na definição (link) é chamado de modo sensível. Talvez você queira alinhar isso.
Heyman
65

A resposta aceita é boa, mas pode ser melhorada com o backup adicional de cada salvamento e o backup de arquivos com versão .

Primeiro, configurações básicas, conforme descrito na resposta aceita :

(setq version-control t     ;; Use version numbers for backups.
      kept-new-versions 10  ;; Number of newest versions to keep.
      kept-old-versions 0   ;; Number of oldest versions to keep.
      delete-old-versions t ;; Don't ask to delete excess backup versions.
      backup-by-copying t)  ;; Copy all files, don't rename them.

Em seguida, também faça backup de arquivos com versão, que o Emacs não executa por padrão (você não confirma em cada salvamento, certo?):

(setq vc-make-backup-files t)

Por fim, faça um backup em cada salvamento, não apenas no primeiro. Fazemos dois tipos de backups:

  1. backups por sessão: uma vez no primeiro salvamento do buffer em cada sessão do Emacs. Eles simulam o comportamento de backup padrão do Emac.

  2. backups por salvamento: uma vez a cada salvamento. O Emacs não faz isso por padrão, mas é muito útil se você deixar o Emacs em execução por um longo tempo.

Os backups vão para lugares diferentes e o Emacs cria os diretórios de backup automaticamente se eles não existirem:

;; Default and per-save backups go here:
(setq backup-directory-alist '(("" . "~/.emacs.d/backup/per-save")))

(defun force-backup-of-buffer ()
  ;; Make a special "per session" backup at the first save of each
  ;; emacs session.
  (when (not buffer-backed-up)
    ;; Override the default parameters for per-session backups.
    (let ((backup-directory-alist '(("" . "~/.emacs.d/backup/per-session")))
          (kept-new-versions 3))
      (backup-buffer)))
  ;; Make a "per save" backup on each save.  The first save results in
  ;; both a per-session and a per-save backup, to keep the numbering
  ;; of per-save backups consistent.
  (let ((buffer-backed-up nil))
    (backup-buffer)))

(add-hook 'before-save-hook  'force-backup-of-buffer)

Fiquei muito interessado neste tópico depois de escrever, em $<vez de $@no meu Makefile, cerca de três horas após o meu commit anterior: P

O texto acima é baseado em uma página do Emacs Wiki que eu editei pesadamente .

ntc2
fonte
Colei o código acima no meu arquivo init.el, mas não recebo nenhum diretório de backup e o emacs ainda cria os arquivos de backup por todo o lado. Eu posso ter entendido algo
errado
@ Stockholm: você colou todo o código na minha resposta, incluindo os setqs na parte superior da minha resposta? O acima funciona para mim no Emacs 24.5.1.
Ntc2 27/11/2015
Começou a funcionar agora. Eu tinha todo o código colado, então não sei por que demorou a aceitar minha nova configuração. Mas muito obrigado!
Soeholm 30/11/2015
1
Como acompanhamento, sei por que não funcionou agora. Funcionou em uma máquina, mas não na outra. Era porque eu tinha um arquivo .emacs vazio no meu diretório pessoal, que tinha prioridade sobre o meu diretório .emacs.d. Erro bobo ..
Soeholm 3/15/15
31

Outra maneira de configurar as opções de backup é através da interface Personalizar. Entrar:

M-x customize-group

E então, no Customize group:prompt, digite backup.

Se você rolar até a parte inferior do buffer, verá a lista de diretórios de backup . Clique em Mostrar valor e defina a primeira entrada da lista da seguinte maneira:

Regexp matching filename: .*
Backup directory name: /path/to/your/backup/dir

Como alternativa, você pode desativar os backups da minha configuração Criar arquivos de backup para off.

Se você não deseja que o Emacs edite automaticamente seu .emacsarquivo, você precisará configurar um arquivo de personalização .

Dave Webb
fonte
4
Eu gostaria de saber cerca de customize-group2 anos atrás. Obrigado!
Wprl
30

Você pode desativá-los completamente

(setq make-backup-files nil)
Paweł Hajdan
fonte
Eu gosto de definir isso no prompt do shell, quando estou pulando de host para host, não gosto de ter arquivos .emacs: emacs --eval "(setq fazer backup de arquivos nulo)"
Dave Morse