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

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

Ответ 1

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

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

Ответ 2

Файлы резервного копирования/автоматического сохранения 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-*-

в файле.

Ответ 3

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

Сначала основные настройки, описанные в приняты ответить:

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

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

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

  • за резервное копирование: один раз при каждом сохранении. 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)

Мне очень понравилась эта тема после того, как я написал $< вместо [email protected] в моем Makefile, примерно через три часа после моего предыдущего фиксации: P

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

Ответ 4

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

M-x customize-group

И затем в приглашении Customize group: введите backup.

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

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

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

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

Ответ 5

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

(setq make-backup-files nil)