Jak Mogę kontrolować, jak Emacs tworzy pliki kopii zapasowych?

Emacs umieszcza pliki kopii zapasowych o nazwie foo~ wszędzie i nie lubię pamiętać o ich usuwaniu. Ponadto, jeśli edytuję plik, który ma twarde łącze gdzieś indziej w systemie plików, twarde łącze wskazuje na kopię zapasową, gdy skończę edytować, a to jest mylące i okropne. Jak Mogę albo wyeliminować te pliki kopii zapasowych, albo kazać im iść w inne miejsce niż ten sam katalog?

 291
Author: jfm3, 2008-09-30

5 answers

Jeśli kiedykolwiek zapisałeś plik kopii zapasowej Emacsa, pewnie chce ich więcej, nie mniej. To irytujące. że znajdują się w tym samym katalogu co edytowany plik, ale to łatwo zmienić. Możesz zrobić wszystkie pliki kopii zapasowej do katalogu, umieszczając w swoim .emacs.

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

Istnieje wiele tajemnych szczegółów związanych z tym, jak Emacs może utworzyć pliki kopii zapasowych. Czy należy zmienić nazwę oryginału i wypisać edytowany bufor? Co jeśli oryginał jest połączony? Ogólnie rzecz biorąc, najbezpieczniejszym, ale najwolniejszym zakładem jest zawsze tworzenie kopii zapasowych kopiując.

(setq backup-by-copying t)

Jeśli z jakiegoś powodu jest to zbyt wolne, możesz również spojrzeć na backup-by-copying-when-linked.

Ponieważ Twoje kopie zapasowe są teraz na swoim miejscu, możesz chcieć więcej,a nie mniej. Zobacz Emacs dokumentacja tych zmiennych (z C-h v).

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

Wreszcie, jeśli absolutnie nie musisz mieć plików kopii zapasowych:

(setq make-backup-files nil)

It makes me sick ale żeby o tym pomyśleć.

 463
Author: jfm3,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-12 18:58:47

Emacs backup / automatyczne zapisywanie plików może być bardzo pomocne. Ale te funkcje są mylące.

Backup files

Pliki Kopii Zapasowych mają tyldy (~ lub ~9~) na końcu i są zapisywane do katalogu domowego użytkownika. Gdy make-backup-files jest INNE niż nil, Emacs automatycznie tworzy kopię zapasową oryginalnego pliku przy pierwszym zapisaniu pliku z bufora. Jeśli edytujesz nowy plik, Emacs utworzy kopię zapasową po drugim zapisaniu pliku.

Nieważne ile po zapisaniu pliku kopia zapasowa pozostaje niezmieniona. Jeśli zabijesz bufor, a następnie odwiedzisz plik ponownie, lub przy następnym uruchomieniu nowej sesji Emacsa, zostanie utworzony nowy plik kopii zapasowej. Nowa kopia zapasowa odzwierciedla zawartość pliku po ponownym otwarciu lub na początku sesji edycji. Ale istniejąca kopia zapasowa nigdy więcej nie zostanie dotknięta. W związku z tym przydatne jest tworzenie numerowanych kopii zapasowych (patrz Konfiguracja poniżej).

Aby utworzyć kopie zapasowe użyj save-buffer (C-x C-s) z przedrostkiem argumenty.

diff-backup i dired-diff-backup porównuje Plik z jego kopią zapasową lub odwrotnie. Ale nie ma funkcji przywracania plików kopii zapasowych. Na przykład w systemie Windows, aby przywrócić plik kopii zapasowej

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

Musi być ręcznie skopiowany jako

C:\Users\USERNAME\.emacs.el

Automatyczne zapisywanie plików

Automatyczne zapisywanie plików za pomocą hashmarks (#) i powinny być zapisywane lokalnie w katalogu projektu (wraz z aktualnymi plikami). Powodem jest to, że automatyczne zapisywanie plików to tylko pliki tymczasowe, które Emacs tworzy, dopóki plik nie zostanie zapisany ponownie (jak w przypadku pośpiesznego posłuszeństwa).

  • zanim użytkownik naciśnie C-x C-s (save-buffer) aby zapisać plik, Emacs automatycznie zapisuje pliki-na podstawie zliczania naciśnięć klawiszy (auto-save-interval) lub po zaprzestaniu pisania (auto-save-timeout).
  • Emacs również automatycznie zapisuje się, gdy ulega awarii, włączając w to zabijanie zadania Emacsa za pomocą polecenia powłoki.

Gdy użytkownik zapisze plik, automatycznie zapisana wersja zostanie usunięta. Ale gdy użytkownik opuszcza plik bez jego zapisywania, Emacs lub sesja X ulega awarii, automatycznie zapisane pliki nadal istnieją.

Użyj revert-buffer lub recover-file, aby przywrócić automatyczne zapisywanie plików. Zauważ, że Emacs zapisuje przerwane sesje w celu późniejszego odzyskania w plikach o nazwie ~/.emacs.d / auto-save-list . Funkcja recover-session wykorzysta te informacje.

Preferowaną metodą odzyskiwania z automatycznie zapisanego pliku jest M-x revert-buffer RET. Emacs zapyta: "Bufor został ostatnio automatycznie zapisany. Przywrócić z automatycznego zapisu pliku?"lub" Przywróć bufor z pliku nazwa pliku?". W przypadku tego ostatniego nie ma automatycznego zapisu pliku. Na przykład, ponieważ zapisałeś plik przed wpisaniem kolejnych naciśnięć klawiszy auto-save-intervall, w którym to przypadku Emacs usunął plik automatycznego zapisu.

Automatyczne zapisywanie jest obecnie domyślnie wyłączone, ponieważ może spowolnić edycję po podłączeniu do wolnego komputera i ponieważ wiele plików zawiera poufne dane.

Konfiguracja

Oto konfiguracja, która IMHO działa najlepiej:

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

Sensitive dane

Innym problemem jest to, że nie chcesz, aby Emacs rozpowszechniał kopie plików z wrażliwymi danymi. Użyj tego trybu na podstawie pliku. Ponieważ jest to tryb minor, dla moich celów przemianowałem go na sensitive-minor-mode.

Aby włączyć go dla wszystkich .vcf i .pliki gpg , w Twoim .emacs używa czegoś takiego:

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

Alternatywnie, aby chronić tylko niektóre pliki, takie jak niektóre .pliki txt , Użyj linii jak

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

W pliku.

 57
Author: Andreas Spindler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-16 07:45:47

Zaakceptowana odpowiedź jest dobry, ale można go znacznie poprawić poprzez dodatkowo tworzenie kopii zapasowych na każdy zapisuje i tworzy kopię zapasową wersjonowanych plików .

Po pierwsze, podstawowe ustawienia opisane w zaakceptowane odpowiedź :

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

Następnie również kopie zapasowe wersjonowanych plików, których Emacs domyślnie nie robi (nie angażujesz się przy każdym zbawieniu, prawda?):

(setq vc-make-backup-files t)
Na koniec zrób kopię zapasową każdego zapisu, a nie tylko pierwszego. Tworzymy dwa rodzaje kopie zapasowe:
  1. Kopie zapasowe na sesję: raz na pierwszy zapis bufora w każdym Sesja Emacs. Symulują one domyślne zachowanie kopii zapasowych Emac.

  2. Kopie zapasowe per-save: raz na co Zapisz. Emacs nie robi tego przez domyślne, ale jest to bardzo przydatne, jeśli pozostawiasz Emacsa działającego przez długi czas czas.

The backups go in different miejsca i Emacs tworzy kopie zapasowe dirs automatycznie, jeśli nie exist:

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

Bardzo zainteresowałem się tym tematem po tym, jak napisałem $< zamiast $@ w moim Makefile, około trzy godziny po moim poprzednim commicie: P

Powyższe jest oparte na stronie Wiki Emacs i mocno edited .

 48
Author: ntc2,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:22

Innym sposobem konfigurowania opcji tworzenia kopii zapasowych jest interfejs Customize. Wejść:

M-x customize-group

, a następnie w wierszu Customize group: wprowadź backup.

Po przewinięciu na dół bufora zobaczysz katalog kopii zapasowej alist. Kliknij Pokaż wartość i ustaw pierwszy wpis listy w następujący sposób:

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

Alternatywnie możesz wyłączyć kopie zapasowe z mojego ustawienia , aby Pliki Kopii Zapasowych zostały zamienione na off.

Jeśli nie chcesz, aby Emacs automatycznie edytował Twoje .emacs plik chcesz skonfigurować plik konfiguracji .

 31
Author: Dave Webb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-30 08:14:27

Możesz je całkowicie wyłączyć przez

(setq make-backup-files nil)
 27
Author: Paweł Hajdan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-21 21:24:48