Jak kontrolować sposób tworzenia kopii zapasowych przez Emacsa?

326

Emacs umieszcza kopie zapasowe nazwane foo~wszędzie i nie chcę pamiętać o ich usuwaniu. Ponadto, jeśli edytuję plik, który ma twardy link gdzieś w systemie plików, twardy link wskazuje kopię zapasową, kiedy skończę edycję, a to jest mylące i okropne. Jak mogę wyeliminować te pliki kopii zapasowej lub pozwolić, aby znalazły się w innym miejscu niż ten sam katalog?

jfm3
źródło

Odpowiedzi:

518

Jeśli kiedykolwiek zapisałeś plik kopii zapasowej Emacsa, prawdopodobnie chcesz ich więcej, a nie mniej. To denerwujące, że znajdują się w tym samym katalogu co edytowany plik, ale łatwo to zmienić. Można dokonać kopii zapasowej wszystkich plików przejdź do katalogu, umieszczając coś jak poniżej w twojej .emacs.

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

Istnieje wiele tajemniczych szczegółów związanych z tym, jak Emacs może tworzyć pliki kopii zapasowych. Czy powinien zmienić nazwę oryginału i wypisać edytowany bufor? Co jeśli oryginał jest połączony? Ogólnie najbezpieczniejszym, ale najwolniejszym zakładem jest zawsze tworzenie kopii zapasowych przez kopiowanie.

(setq backup-by-copying t)

Jeśli z jakiegoś powodu jest to zbyt wolne, możesz też rzucić okiem backup-by-copying-when-linked.

Ponieważ kopie zapasowe są teraz na swoim miejscu, możesz chcieć ich więcej, a nie mniej. Zajrzyj do dokumentacji Emacsa dla 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 zapasowej:

(setq make-backup-files nil)

Jednak myślę o tym, że jestem chory.

jfm3
źródło
6
hej, ale tworzy kopie zapasowe o nazwie takiej jak ta! home! svradmin! foo ~ i nie mogę otworzyć pliku
Jaime Hablutzel
33
dlaczego warto korzystać z kopii zapasowych? dlaczego nie użyć git / mercurial? dobre systemy kontroli wersji i metodologie programowania powinny przebijać kopie zapasowe poszczególnych plików przez edytor
vol7ron
52
@ vol7ron: Kopie zapasowe służą do edytowania czegoś, co nie jest pod kontrolą wersji - na przykład pliku konfiguracyjnego lub czegoś szybkiego i brudnego, czego jeszcze nie udało się wprowadzić w kontrolę wersji. Następnie, gdy nie robisz tego, co powinieneś, redaktor oszczędza ci szyję.
Tytułowy
69
@ vol7ron - To po prostu źle. Nie powinieneś poddawać bzdur kontroli wersji, których nie chcesz zachować. Utrudnia to znalezienie ważnych rzeczy. Zamiast tego użyj kopii zapasowych edytora do tego, do czego są dobre (tworzenie kopii zapasowych zmian w nagłych wypadkach) i kontroluj zmiany do tego, do czego służą (utrzymywanie ważnych wersji oprogramowania i ułatwianie rozwoju zespołu). Użyj odpowiedniego narzędzia do pracy.
TED
26
„Pliki kopii zapasowych powodują tak duże obciążenie i prawie nie mają żadnej wartości”: czy to nie jest osąd?
Nędzna Zmienna
70

Pliki kopii zapasowej / automatycznego zapisywania programu Emacs mogą być bardzo pomocne. Ale te funkcje są mylące.

Kopia zapasowa

Pliki kopii zapasowych mają na końcu tyldy ( ~lub ~9~) i powinny zostać zapisane w katalogu osobistym użytkownika. Gdy make-backup-filesjest inny niż zero, Emacs automatycznie tworzy kopię zapasową oryginalnego pliku przy pierwszym zapisaniu pliku z bufora. Jeśli edytujesz nowy plik, Emacs utworzy kopię zapasową przy drugim zapisywaniu pliku.

Bez względu na to, ile razy zapisujesz plik, kopia zapasowa pozostaje niezmieniona. Jeśli zabijesz bufor, a następnie ponownie odwiedzisz plik lub następnym razem, gdy rozpoczniesz nową sesję 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 nie zostanie zmieniona. Dlatego uważam, że przydatne jest tworzenie numerowanych kopii zapasowych (patrz konfiguracja poniżej).

Aby utworzyć kopie zapasowe jawnie użyj save-buffer( C-x C-s) z argumentami przedrostka.

diff-backupi dired-diff-backupporównuje plik z 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~

należy go ręcznie skopiować jako

C:\Users\USERNAME\.emacs.el

Automatyczne zapisywanie plików

Pliki automatycznego zapisywania używają skrótów ( #) i powinny być zapisywane lokalnie w katalogu projektu (wraz z rzeczywistymi plikami). Powodem jest to, że pliki automatycznego zapisywania są tylko plikami tymczasowymi, które tworzy Emacs, 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 liczenia naciśnięć klawiszy ( auto-save-interval) lub gdy przestaniesz pisać ( auto-save-timeout).
  • Emacs zapisuje także automatycznie, gdy się zawiesi, w tym zabijając zadanie Emacsa za pomocą polecenia powłoki.

Gdy użytkownik zapisuje plik, automatycznie zapisana wersja jest usuwana. Ale gdy użytkownik zamknie plik bez zapisywania go, nastąpi awaria Emacsa lub sesji X, automatycznie zapisywane pliki nadal istnieją.

Użyj revert-bufferlub, recover-fileaby przywrócić pliki automatycznego zapisywania. Zauważ, że Emacs rejestruje przerwane sesje do późniejszego odzyskania w plikach o nazwie ~ / .emacs.d / auto-save-list . recover-sessionFunkcja będzie wykorzystywać te informacje.

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

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

Konfiguracja

Oto konfiguracja, którą IMHO najlepiej działa:

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

Dane wrażliwe

Innym problemem jest to, że nie chcesz, aby Emacs rozpowszechniał kopie plików z poufnymi danymi. Używaj tego trybu dla poszczególnych plików. Ponieważ jest to tryb mniejszy, na moje potrzeby przemianowałem go sensitive-minor-mode.

Aby włączyć to dla wszystkich plików .vcf i .gpg , w .emacs użyj 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 .txt , użyj linii podobnej do

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

w pliku.

Andreas Spindler
źródło
Więc nie używasz autozapisu? Te ustawienia pozwalają uniknąć konieczności oglądania tych nieprzyjemnych plików # filename.tex # w folderze?
PascalVKooten
3
Zawsze domyślnie używam plików automatycznego zapisywania i tworzenia kopii zapasowych, z wyjątkiem plików z wrażliwymi danymi. Tryb wrażliwy wyłącza automatyczne zapisywanie i tworzenie kopii zapasowych. BTW, pliki # file.ext # nie są naprawdę nieprzyjemne, ponieważ Emacs tworzy je i usuwa w razie potrzeby. Jeśli pozostaną, albo Emacs nadal działa, albo są artefaktem z rozbitego Emacsa. W obu przypadkach mogą uratować dzień ;-)
Andreas Spindler
Ach, dzięki za te dodatkowe informacje. Rzeczywiście mam z nimi głównie pozytywne doświadczenia (uratowali mi dzień). Tylko wtedy, gdy szukasz brzydoty, dobrze
trafiłeś
BTW to jedna rzecz do tworzenia kopii zapasowych, a inna rzecz do przywracania kopii zapasowych. Dlatego graj z automatycznym zapisywaniem. Zabij zadanie Emacsa lub sesję ssh. Jeśli istnieje plik autozapisu, diffto plik z rzeczywistym plikiem. Następnie zwolnij Emacsa i sam dowiedz się, co revert-bufferrobi. W nagłych przypadkach zwróci się to szybko.
Andreas Spindler
Tryb czułości działa świetnie. Dzięki. Pamiętaj, że w swoim poście nazywacie go trybem wrażliwym-mniejszym, natomiast w definicji (link) nazywa się to trybem wrażliwym. Może chcesz to wyrównać.
HeyMan
65

Odpowiedź akceptowana jest dobra, ale może być znacznie poprawiona przez dodatkowo tworzenie kopii zapasowych na każdy Zapisz i tworzenia kopii zapasowych wersjonowanych plików .

Po pierwsze, podstawowe ustawienia opisane w zaakceptowanej odpowiedzi :

(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ż wykonaj kopię zapasową plików, których Emacs domyślnie nie robi (nie zatwierdzasz przy każdym zapisie, prawda?):

(setq vc-make-backup-files t)

Na koniec wykonaj kopię zapasową przy każdym zapisie, nie tylko pierwszym. Wykonujemy dwa rodzaje kopii zapasowych:

  1. kopie zapasowe na sesję: raz przy pierwszym zapisie bufora w każdej sesji Emacsa. Symulują one domyślne zachowanie Emac do tworzenia kopii zapasowych.

  2. kopie zapasowe na zapis: raz na każde zapisanie. Emacs domyślnie tego nie robi, ale jest to bardzo przydatne, jeśli pozostawisz Emacsa działającym przez długi czas.

Te kopie zapasowe iść w różnych miejscach i Emacs tworzy katalogi zapasowych automatycznie, jeśli nie istnieją:

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

Zainteresowałem się tym tematem po napisaniu $<zamiast $@w moim Makefile, około trzech godzin po moim poprzednim zatwierdzeniu: P

Powyższe oparte jest na mocno edytowanej przeze mnie stronie Wiki Emacsa .

ntc2
źródło
Wkleiłem powyższy kod w pliku init.el, ale nie otrzymuję żadnego katalogu kopii zapasowej, a emacs nadal tworzy pliki kopii zapasowej w całym pliku. Mogłem coś źle zrozumieć, jestem nowy w emacs: P
Soeholm
@Soeholm: czy wkleiłeś cały kod w mojej odpowiedzi, w tym setqs na górze mojej odpowiedzi? Powyższe działa dla mnie w Emacs 24.5.1.
ntc2
Zaczęło działać teraz. Wkleiłem cały kod, więc nie jestem pewien, dlaczego tak wolno było zaakceptować moją nową konfigurację. Ale wielkie dzięki!
Soeholm
1
Jako kontynuację wiem, dlaczego to teraz nie działało. Działało na jednej maszynie, ale nie na drugiej. To dlatego, że miałem pusty plik .emacs w moim katalogu domowym, co miało wyższy priorytet niż mój katalog .emacs.d.
Głupia
31

Innym sposobem konfigurowania opcji tworzenia kopii zapasowych jest interfejs Dostosuj. Wchodzić:

M-x customize-group

A następnie po Customize group:monicie wpisz backup.

Jeśli przewiniesz do dolnej części bufora, zobaczysz Backup Directory Alist . Kliknij opcję Pokaż wartość i ustaw pierwszy wpis na liście w następujący sposób:

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

Alternatywnie, można włączyć tworzenie kopii zapasowych poza moim otoczeniu zrobić kopię zapasową plików do off.

Jeśli nie chcesz, aby Emacs automatycznie edytować .emacsplik, musisz skonfigurować plik dostosowań .

Dave Webb
źródło
4
Chciałbym wiedzieć około customize-group2 lata temu. Dziękuję Ci!
wprl
30

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

(setq make-backup-files nil)
Paweł Hajdan
źródło
Lubię to ustawić w wierszu poleceń powłoki, kiedy skaczę z hosta na hosta, nie lubię mieć plików .emacs: emacs --eval "(setq make-backup-files nil)"
Dave Morse