2008-09-30 2 views
278

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

ответ

440

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

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

+5

эй, но он создает резервные копии с таким именем, как этот! Home! Svradmin! Foo ~ и я не могу открыть файл –

+28

зачем использовать резервные копии? почему бы не использовать git/mercurial? хорошие системы управления версиями и методологии программирования должны превзойти отдельную резервную копию файла редактором – vol7ron

+37

@ vol7ron: резервные копии предназначены для того, когда вы редактируете что-то не под управлением версиями - например, файл конфигурации или что-то быстрое и грязное, что вы не получили добавив в управление версиями еще. Затем, когда вы не делаете то, что должны, редактор сохраняет вашу шею. – Eponymous

29

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

M-x customize-group 

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

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

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

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

Если вы не хотите, чтобы Emacs автоматически редактировал ваш файл .emacs, вы хотите, чтобы set up a customisations file.

+3

Хотел бы я знать о 'customize-group' 2 года назад. Спасибо! – wprl

27

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

(setq make-backup-files nil) 
+0

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

53

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. Функция будет использовать эту информацию.

Предпочтительный способ восстановления из автоматически сохраненной записи - 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 распространенные копии файлы с конфиденциальными данными. Используйте this mode для каждого файла. Поскольку это второстепенный режим, для моих целей я переименовал его 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-*- 

в файле.

+0

So вы не используете автосохранение? Эти настройки позволяют избежать необходимости видеть эти неприятные #filename.tex # в вашей папке? – PascalVKooten

+3

Я по умолчанию использую файлы автосохранения и резервного копирования, за исключением файлов с конфиденциальными данными. Чувствительный режим отключает автосохранение и резервное копирование. Файлы BTW, # file.ext # на самом деле не противны, потому что Emacs создает и удаляет их по мере необходимости. Если они остаются либо Emacs все еще работает, либо они являются артефактом из разбившегося Emacs. В обоих случаях они могут сэкономить день ;-) –

+0

Ах, спасибо за эту дополнительную информацию. У меня действительно есть положительный опыт с ними (они спасли мой день). Только когда вы ищете уродство, ну, вы получили его прямо там :) – PascalVKooten

43

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

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

(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 за длительное время .

backups go in different places и 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 page I heavily edited.

+2

Это должен быть принятый ответ – psp

+0

Я вставил код выше в мой файл init.el, но я не получаю никакой резервной директории, и emacs по-прежнему создает файлы резервных копий. Возможно, я что-то неправильно понял, я новичок в emacs: P – Soeholm

+0

@Soeholm: вы ввели * все * кода в мой ответ, в том числе 'setq's в верхней части моего ответа? Вышеупомянутое работает для меня в Emacs 24.5.1. – ntc2

Смежные вопросы