Como eu controlo como o Emacs cria arquivos de backup?

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

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

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

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

 (setq backup-by-copying t) 

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

Como seus backups estão todos em seu próprio lugar agora, você pode querer mais deles, em vez de menos deles. Dê uma olhada na documentação do Emacs para essas variables ​​(com Ch v ).

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

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

 (setq make-backup-files nil) 

Me deixa doente pensar nisso.

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

Arquivos de backup

Os arquivos de backup têm tils ( ~ ou ~9~ ) no final e devem ser gravados no diretório inicial do usuário. Quando make-backup-files é não-nulo, o Emacs automaticamente cria 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 permanece inalterado. Se você matar o buffer e visitar o arquivo novamente, ou na próxima vez que iniciar uma nova session do Emacs, um novo arquivo de backup será criado. O novo backup reflete o conteúdo do arquivo depois de reaberto, ou no início das sessões de edição. Mas um backup existente nunca é tocado novamente. Portanto, acho útil para backups numerados criados (veja a configuração abaixo).

Para criar backups, use explicitamente o save-buffer ( Cx Cs ) com argumentos de prefixo.

diff-backup e o dired-diff-backup comparam um arquivo com seu backup ou vice-versa. Mas não há nenhuma function 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~ 

tem que ser manualmente copiado como

 C:\Users\USERNAME\.emacs.el 

Salvar arquivos automaticamente

Arquivos salvos automaticamente usam hashmarks ( # ) e devem ser escritos localmente dentro do diretório do projeto (junto com os arquivos reais). A razão é que os arquivos de salvamento automático são apenas arquivos temporários que o Emacs cria até que um arquivo seja salvo novamente (como com a obediência apressada).

  • Antes de o usuário pressionar Cx Cs ( save-buffer ) para salvar um arquivo, o Emacs salva automaticamente os arquivos – baseado na contagem de teclas ( auto-save-interval ) ou quando você para de digitar ( auto-save-timeout ).
  • O Emacs também salva automaticamente sempre que falha, incluindo a eliminação da tarefa 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 session X trava, os arquivos salvos automaticamente ainda existem.

Use o revert-buffer ou o recover-file de recuperação para restaurar os arquivos de salvamento automático. Observe que o Emacs registra sessões interrompidas para recuperação posterior em arquivos chamados ~ / .emacs.d / auto-save-list . A function de recover-session usará essa informação.

O método preferido para recuperar de um arquivamento salvo automaticamente é Mx revert-buffer RET . O Emacs perguntará “O buffer foi salvo automaticamente recentemente. Reverta do arquivo de salvamento automático?” ou “Reverter buffer do arquivo FILENAME?”. No caso do último, não há arquivo de salvamento automático. Por exemplo, porque você salvou antes de digitar outro pressionamento de tecla auto-save-intervall , nesse caso o Emacs excluiu o arquivo de salvamento automático.

O salvamento automático está atualmente desabilitado por padrão porque pode reduzir a velocidade de 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 funciona melhor IMHO:

 (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 quer que o Emacs distribua cópias de arquivos com dados confidenciais. Use este modo em uma base por arquivo. Como este é um modo menor, para os meus propósitos, eu o renomei como 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.

A resposta aceita é boa, mas pode ser muito melhorada, além de fazer backup em cada economia e fazer 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 versionados, o que o Emacs não faz por padrão (você não faz commit a cada salvamento, certo?):

 (setq vc-make-backup-files t) 

Por fim, faça um backup em cada salvamento, não apenas o primeiro. Nós fazemos dois tipos de backups:

  1. backups por session: uma vez no primeiro salvamento do buffer em cada session do Emacs. Estes 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 rodando por um longo tempo.

Os backups vão em 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 que escrevi $< vez de $@ no meu Makefile , cerca de três horas após meu commit anterior: P

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

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

 Mx customize-group 

E, em seguida, no Customize group: prompt, insira o backup .

Se você rolar para a parte inferior do buffer, você verá o Backup Directory Alist . Clique em Mostrar valor e defina a primeira input da lista da seguinte maneira:

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

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

Se você não quiser que o Emacs edite automaticamente o arquivo .emacs será necessário configurar um arquivo de personalização .

Você pode desativá-los completamente

 (setq make-backup-files nil)