Как мне контролировать, как Emacs создает резервные копии файлов?

327

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

jfm3
источник

Ответы:

519

Если вы когда-либо были сохранены в файле резервной копии 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)

Мне больно думать об этом, хотя.

jfm3
источник
6
эй, но он создает резервные копии с таким именем! home! svradmin! foo ~, и я не могу открыть файл
Хайме Хаблутцель,
33
зачем использовать резервные копии? почему бы не использовать git / mercurial? Хорошие системы контроля версий и методологии программирования должны превосходить отдельные резервные копии файлов редактором
vol7ron
52
@ vol7ron: Резервные копии предназначены для того, когда вы редактируете что-то, не находящееся под контролем версий - например, файл конфигурации или что-то быстрое и грязное, что вы еще не удосужились включить в управление версиями. Затем, когда вы не делаете то, что должны, редактор спасает вашу шею.
одноименный
69
@ vol7ron - Это просто неправильно. Вы не должны помещать дерьмо в контроль версий, который вы не хотите оставлять. Это только затрудняет поиск важных вещей. Вместо этого используйте резервные копии вашего редактора для того, для чего они хороши (резервное копирование изменений в экстренных случаях), а для контроля ревизий - для чего они хороши (хранение важных версий вашего программного обеспечения и содействие групповой разработке). Используйте правильный инструмент для работы.
TED
26
«Резервное копирование файлов добавляет столько накладных расходов и почти не имеет значения»: разве это не суждение?
Мизерная переменная
70

Резервное копирование / автосохранение 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

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

Автосохранение файлов использует hashmarks ( #) и должно быть записано локально в каталоге проекта (вместе с реальными файлами). Причина в том, что файлы автосохранения - это просто временные файлы, которые 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 удалил файл автосохранения.

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

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

Вот конфигурация, которая 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)
      )

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

Другая проблема заключается в том, что вы не хотите, чтобы 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-*-

в файле.

Андреас Шпиндлер
источник
Так вы не используете автосохранение? Эти настройки позволяют избежать просмотра этих неприятных файлов # filename.tex # в вашей папке?
PascalVKooten
3
Я всегда использую автосохранение и резервное копирование файлов по умолчанию, за исключением файлов с конфиденциальными данными. Чувствительный режим отключает автосохранение и резервное копирование. Кстати, # file.ext # файлы на самом деле не противные, потому что Emacs создает и удаляет их по мере необходимости. Если они остаются, либо Emacs все еще работает, либо они являются артефактом разбитого Emacs. В обоих случаях они могут спасти день ;-)
Андреас Шпиндлер
Ах, спасибо за эту дополнительную информацию. У меня действительно положительный опыт общения с ними (они спасли мой день). Только когда вы ищете уродство, хорошо, вы поняли это прямо здесь :)
PascalVKooten
Кстати, создание резервных копий - это одно, а восстановление резервных копий - другое. Следовательно играть с автосохранением. Убейте задание Emacs или сессию ssh. Если есть файл diffс автоматическим сохранением, то он с фактическим файлом. Затем запустите Emacs и узнайте сами, что revert-bufferделает. Это быстро окупится в случае крайней необходимости.
Андреас Шпиндлер
Чувствительный режим работает отлично. Спасибо. Обратите внимание, что в своем посте вы называете режим «чувствительный минор», тогда как в определении (ссылка) он называется «чувствительный режим». Может быть, вы хотите выровнять это.
HeyMan
65

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

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

(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, которую я сильно отредактировал .

NTC2
источник
Я вставил приведенный выше код в свой файл init.el, но я не получил никакой резервной директории, а emacs по-прежнему создает файлы резервных копий. Я мог что-то неправильно понять, я новичок в emacs: P
Soeholm
@Soeholm: ты вставил весь код в мой ответ, включая setqs в верхней части моего ответа? Вышеуказанное работает для меня в Emacs 24.5.1.
ntc2
Это начало работать сейчас. Я вставил весь код, поэтому я не уверен, почему он не принял мою новую конфигурацию. Но большое спасибо!
Сохольм
1
В качестве продолжения я знаю, почему это не сработало сейчас. Это работало на одной машине, но не на другой. Это было потому, что у меня был пустой файл .emacs в моем домашнем каталоге, который имел приоритет над моим каталогом .emacs.d. Глупая ошибка ..
Сохольм
31

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

M-x customize-group

А затем по Customize group:запросу введите backup.

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

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

Кроме того, вы можете отключить резервное копирование моего параметра Make Backup Files to off.

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

Дэйв Уэбб
источник
4
Я хотел бы знать около customize-group2 лет назад. Спасибо!
апреля
30

Вы можете отключить их в целом

(setq make-backup-files nil)
Павел Хайдан
источник
Мне нравится устанавливать это из командной строки, когда я перехожу с хоста на хост, мне не нравится иметь файлы .emacs: emacs --eval "(setq make-backup-files nil)"
Дейв Морс