Як я можу контролювати, як Emacs створює резервні файли?


326

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

Відповіді:


518

Якщо вас коли-небудь зберігав файл резервної копії 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)

Мені це боляче думати про це.


6
ей, але це створює резервні копії з таким ім'ям! home! svradmin! foo ~, і я не можу відкрити файл
Jaime Hablutzel

33
навіщо використовувати резервні копії? чому б не використовувати git / mercurial? хороші системи управління версіями та методології програмування повинні
козирувати

52
@ vol7ron: Резервні копії призначені для того, щоб ви редагували щось, що не перебуває під контролем версій - наприклад, конфігураційний файл або щось швидке і брудне, чого ви ще не збиралися вводити в контроль версій. Потім, коли ви не робили того, що вам належить, редактор зберігає вам шию.
однойменний

69
@ vol7ron - Це просто неправильно. Вам не слід вводити лайно в контроль редагування, який ви не хочете тримати. Це просто ускладнює пошук важливих речей. Натомість використовуйте резервні копії редактора для того, для чого вони хороші (резервне копіювання змін у разі надзвичайних ситуацій) та контролюйте версію того, що його корисно (збереження важливих версій програмного забезпечення та полегшення розробки команди). Використовуйте правильний інструмент для роботи.
ТЕД

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

Автоматичне збереження файлів

Файли, що автоматично зберігаються, використовують хештеки ( #) та записуються локально в каталозі проекту (разом із власне файлами). Причина полягає в тому, що файли автоматичного збереження - це лише тимчасові файли, які створює 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
Я завжди використовую файли автоматичного збереження та резервного копіювання за замовчуванням, за винятком файлів із конфіденційними даними. Чутливий режим відключає автоматичне збереження та резервне копіювання. BTW, # file.ext # файли насправді неприємні, оскільки Emacs створює та видаляє їх у міру необхідності. Якщо вони залишаються, Emacs все ще працює, або вони є артефактом розбитого Emacs. В обох випадках вони можуть врятувати день ;-)
Андреас Шпіндлер

А, дякую за додаткову інформацію. Я з ними в основному позитивний досвід (вони врятували мені день). Тільки коли ти шукаєш потворності, добре, що ти там це зрозумів :)
PascalVKooten

BTW - це одне, що робити резервні копії, і інша річ відновити резервні копії. Отже, грайте з автоматичним збереженням. Вбийте завдання 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, яку я багато редагував .


Я вставив вищезазначений код у мій файл init.el, але я не отримую жодної каталогу резервного копіювання, а emacs все ще створює файли резервного копіювання в усьому. Можливо, я щось неправильно зрозумів, я новачок у emacs: P
Soeholm

@Soeholm: ти вставив увесь код у моїй відповіді, включаючи setqs у верхній частині моєї відповіді? Вищезазначене працює для мене в Emacs 24.5.1.
ntc2

Він почав працювати зараз. У мене був вставлений весь код, тому я не впевнений, чому повільно прийняти мою нову конфігурацію. Але велике спасибі!
Soeholm

1
Як подальший досвід, я знаю, чому це не працювало зараз. Він працював на одній машині, але не на іншій. Це було тому, що у мене в домашньому каталозі був порожній файл .emacs, який мав пріоритет над моїм каталогом .emacs.d. Дурна помилка ..
Soeholm

31

Ще один спосіб налаштування параметрів резервного копіювання - через інтерфейс Налаштувати. Введіть:

M-x customize-group

А потім у відповідь Customize group:підкажіть backup.

Якщо ви прокрутите до нижньої частини буфера, ви побачите список резервного каталогу . Клацніть Показати значення та встановіть перший запис у списку таким чином:

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

Крім того, ви можете вимкнути резервні копії мого налаштування Зробити файли резервного копіювання в off.

Якщо ви не хочете, щоб Emacs автоматично редагував .emacsфайл, ви хочете створити файл налаштування .


4
Я б хотів, щоб це знав близько customize-group2 років тому. Дякую!
wprl

30

Ви можете їх повністю відключити за допомогою

(setq make-backup-files nil)

Мені подобається встановлювати це з підказки оболонки, коли я переходжу з хоста на хост, мені не подобається мати .emacs файли: emacs --eval "(setq make-backup-files nil)"
Дейв Морз
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.