Как мне контролировать, как Emacs создает резервные копии файлов? - PullRequest
310 голосов
/ 30 сентября 2008

Emacs повсюду помещает файлы резервных копий с именем foo~, и я не люблю вспоминать об их удалении. Кроме того, если я редактирую файл с жесткой ссылкой где-то еще в файловой системе, то жесткая ссылка указывает на резервную копию, когда я закончу редактирование, и это сбивает с толку и ужасно. Как я могу либо удалить эти файлы резервных копий, либо сделать так, чтобы они находились где-то, кроме того же каталога?

Ответы [ 5 ]

491 голосов
/ 30 сентября 2008

Если вы когда-либо были сохранены в файле резервной копии Emacs, вы вероятно, хотят больше, а не меньше. Это раздражает что они находятся в том же каталоге, что и файл, который вы редактируете, но это легко изменить. Вы можете сделать все файлы резервной копии идти в каталог, поместив что-то вроде следующего в вашем .emacs.

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

Есть ряд загадочных деталей, связанных с тем, как Emacs может создать ваши файлы резервных копий. Если переименовать оригинал и выписать отредактированный буфер? Что делать, если оригинал связан? В общем, самая безопасная, но самая медленная ставка - всегда делать резервные копии копируя.

(setq backup-by-copying t)

Если по какой-то причине это слишком медленно, вы также можете взглянуть на backup-by-copying-when-linked.

Поскольку все ваши резервные копии теперь находятся на своем месте, вы можете захотеть больше, а не меньше. Посмотрите на Emacs документация для этих переменных (с C-h v).

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

Наконец, если вам абсолютно не нужны файлы резервных копий:

(setq make-backup-files nil)

Хотя меня тошнит от этого.

63 голосов
/ 20 августа 2013

Резервное копирование / автоматическое сохранение файлов Emacs может быть очень полезным. Но эти особенности сбивают с толку.

Резервное копирование файлов

Файлы резервных копий имеют тильды (~ или ~9~) в конце и должны быть записаны в домашний каталог пользователя. Если make-backup-files не ноль, Emacs автоматически создает резервную копию исходного файла при первом сохранении файла из буфера. Если вы редактируете новый файл, Emacs создаст резервную копию при втором сохранении файла.

Независимо от того, сколько раз вы сохраняете файл, резервная копия остается неизменной. Если вы уничтожите буфер, а затем снова зайдете в этот файл или при следующем запуске нового сеанса Emacs будет создан новый файл резервной копии. Новая резервная копия отражает содержимое файла после повторного открытия или в начале сеансов редактирования. Но существующая резервная копия больше никогда не затрагивается. Поэтому я считаю, что это полезно для создания пронумерованных резервных копий (см. Конфигурацию ниже).

Для создания резервных копий явно используйте save-buffer (C-x C-s) с префиксными аргументами.

diff-backup и dired-diff-backup сравнивает файл с его резервной копией или наоборот. Но нет функции восстановления файлов резервных копий. Например, под Windows, чтобы восстановить файл резервной копии

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

необходимо скопировать вручную как

C:\Users\USERNAME\.emacs.el

Автосохранение файлов

Файлы автосохранения используют хэш-метки (#) и должны записываться локально в каталоге проекта (вместе с реальными файлами). Причина в том, что файлы автосохранения - это просто временные файлы, которые Emacs создает, пока файл не будет сохранен снова (как при поспешном послушании).

  • Прежде чем пользователь нажмет C-x C-s (save-buffer), чтобы сохранить файл Emacs автоматически сохранит файлы - на основе подсчета нажатий клавиш (auto-save-interval) или когда вы прекратите вводить (auto-save-timeout).
  • Emacs также автоматически сохраняет при каждом сбое, включая уничтожение задания Emacs с помощью команды оболочки.

Когда пользователь сохраняет файл, автоматически сохраненная версия удаляется. Но когда пользователь выходит из файла, не сохраняя его, Emacs или сеанс X аварийно завершают работу, автоматически сохраняемые файлы все еще существуют.

Используйте revert-buffer или recover-file для восстановления автоматически сохраненных файлов. Обратите внимание, что Emacs записывает прерванные сеансы для последующего восстановления в файлы с именем ~ / .emacs.d / auto-save-list . Функция recover-session будет использовать эту информацию.

Предпочтительным методом восстановления из автоматически сохраненного файла является M-x revert-buffer RET. Emacs спросит: «Буфер был автоматически сохранен недавно. Восстановить из файла автосохранения?» или «Восстановить буфер из файла FILENAME?». В последнем случае нет файла автосохранения. Например, потому что вы сохранили перед вводом еще одного auto-save-intervall нажатия клавиш, в этом случае Emacs удалил файл автосохранения.

Автосохранение в настоящее время отключено по умолчанию, поскольку оно может замедлить редактирование при подключении к медленному компьютеру, а также потому, что многие файлы содержат конфиденциальные данные.

Конфигурация

Вот конфигурация, которая ИМХО работает лучше всего:

(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)
      )

конфиденциальные данные

Другая проблема заключается в том, что вы не хотите, чтобы Emacs распространял копии файлов с конфиденциальными данными. Используйте этот режим для каждого файла отдельно. Поскольку это второстепенный режим, для моих целей я переименовал его в sensitive-minor-mode.

Чтобы включить его для всех файлов .vcf и .gpg , в ваших .emacs используйте что-то вроде:

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

В качестве альтернативы, чтобы защитить только некоторые файлы, например, .txt , используйте строку типа

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

в файле.

56 голосов
/ 29 декабря 2013

принятый ответ хорошо, но это может быть значительно улучшено путем дополнительного резервного копирования на каждые сохранение и резервное копирование версионные файлы .

Во-первых, приняты основные настройки, описанные в ответить

(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.

Далее, также резервное копирование версионных файлов, которые Emacs по умолчанию не делает (вы не делаете фиксацию при каждом сохранении, верно?):

(setq vc-make-backup-files t)

Наконец, делайте резервную копию при каждом сохранении, а не только при первом. Мы делаем два виды резервных копий:

  1. резервных копий за сеанс: один раз при первом сохранении буфера в каждом Сессия Emacs. Они имитируют стандартное поведение резервного копирования Emac.

  2. резервных копий за сохранение: один раз на каждые сохранения. Emacs не делает этого по умолчанию, но это очень полезно, если вы оставите Emacs включенным на долгое время время.

резервные копии идут в разных мест и Emacs создает резервные каталоги автоматически, если они не существуют:

;; 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)

Я очень заинтересовался этой темой после того, как написал $< вместо $@ в моем Makefile, примерно через три часа после моего предыдущего коммита: P

Вышесказанное основано на Emacs Wiki странице, которую я сильно изм .

31 голосов
/ 30 сентября 2008

Другой способ настройки параметров резервного копирования - через интерфейс настройки. Введите:

M-x customize-group

А затем в командной строке Customize group: введите backup.

Если вы прокрутите до конца буфера, вы увидите Резервный каталог Alist . Нажмите Показать значение и установите первую запись в списке следующим образом:

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

В качестве альтернативы, вы можете отключить резервное копирование моих настроек Сделать резервные копии файлов до off.

Если вы не хотите, чтобы Emacs автоматически редактировал ваш .emacs файл, вам нужно настроить файл настроек .

28 голосов
/ 22 января 2009

Вы можете полностью отключить их с помощью

(setq make-backup-files nil)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...