Làm cách nào để kiểm soát cách Emacs tạo các tệp sao lưu?


326

Emacs đặt các tệp sao lưu có tên foo~ở khắp mọi nơi và tôi không cần phải nhớ xóa chúng. Ngoài ra, nếu tôi chỉnh sửa một tệp có liên kết cứng ở một nơi khác trong hệ thống tệp, liên kết cứng sẽ trỏ đến bản sao lưu khi tôi chỉnh sửa xong, điều đó thật khó hiểu và khủng khiếp. Làm cách nào tôi có thể loại bỏ các tệp sao lưu này hoặc để chúng đi đến một nơi khác ngoài cùng thư mục?

Câu trả lời:


518

Nếu bạn đã từng được lưu bởi một tệp sao lưu Emacs, có lẽ bạn muốn nhiều hơn chúng, không phải ít hơn chúng. Thật khó chịu khi chúng nằm trong cùng thư mục với tệp bạn đang chỉnh sửa, nhưng điều đó rất dễ thay đổi. Bạn có thể làm cho tất cả các tệp sao lưu vào một thư mục bằng cách đặt một cái gì đó như sau vào trong của bạn .emacs.

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

Có một số chi tiết phức tạp liên quan đến cách Emacs có thể tạo các tệp sao lưu của bạn. Nó có nên đổi tên bản gốc và viết ra bộ đệm đã chỉnh sửa không? Nếu bản gốc được liên kết thì sao? Nói chung, đặt cược an toàn nhất nhưng chậm nhất là luôn tạo bản sao lưu bằng cách sao chép.

(setq backup-by-copying t)

Nếu điều đó quá chậm vì một số lý do, bạn cũng có thể xem qua backup-by-copying-when-linked .

Vì các bản sao lưu của bạn hiện đang ở vị trí của riêng họ, nên bạn có thể muốn nhiều hơn, thay vì ít hơn. Hãy xem tài liệu Emacs cho các biến này (với C-h v).

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

Cuối cùng, nếu bạn hoàn toàn không có tệp sao lưu:

(setq make-backup-files nil)

Nó làm cho tôi bị bệnh khi nghĩ về nó mặc dù.


6
này nhưng nó đang tạo các bản sao lưu với một cái tên như thế này! home! svradmin! foo ~ và tôi không thể mở tập tin
Jaime Hablutzel

33
Tại sao nên sử dụng bản sao lưu? Tại sao không sử dụng git / mercurial? hệ thống kiểm soát phiên bản tốt và phương pháp lập trình sẽ hỗ trợ sao lưu tệp cá nhân bởi trình chỉnh sửa
vol7ron

52
@ vol7ron: Các bản sao lưu dành cho khi bạn đang chỉnh sửa thứ gì đó không thuộc kiểm soát phiên bản - như tệp cấu hình hoặc thứ gì đó nhanh và bẩn mà bạn chưa có để đưa vào kiểm soát phiên bản. Sau đó, khi bạn chưa làm những gì bạn cần, biên tập viên sẽ cứu bạn.
Eponymous

69
@ vol7ron - Điều đó thật sai lầm. Bạn không nên đặt crap vào kiểm soát sửa đổi mà bạn không muốn giữ. Nó chỉ làm cho việc tìm kiếm những thứ quan trọng khó hơn. Thay vào đó, hãy sử dụng các bản sao lưu trình chỉnh sửa của bạn cho những gì chúng tốt (sao lưu các thay đổi trong trường hợp khẩn cấp) và kiểm soát sửa đổi cho những gì tốt cho nó (giữ các phiên bản quan trọng của phần mềm của bạn và tạo điều kiện phát triển nhóm). Sử dụng các công cụ thích hợp cho công việc.
TED

26
"Các tập tin sao lưu bổ sung quá nhiều chi phí và hầu như không có giá trị": đó không phải là sự phán xét sao?
Biến khổ sở

70

Emacs sao lưu / tự động lưu tập tin có thể rất hữu ích. Nhưng những tính năng này là khó hiểu.

Tập tin sao lưu

Các tập tin sao lưu có dấu ( ~hoặc ~9~) ở cuối và sẽ được ghi vào thư mục gốc của người dùng. Khi nàomake-backup-files không phải là Emacs sẽ tự động tạo bản sao lưu của tệp gốc vào lần đầu tiên tệp được lưu từ bộ đệm. Nếu bạn đang chỉnh sửa tệp mới, Emacs sẽ tạo bản sao lưu vào lần thứ hai bạn lưu tệp.

Cho dù bạn lưu tập tin bao nhiêu lần thì bản sao lưu vẫn không thay đổi. Nếu bạn tắt bộ đệm và sau đó truy cập lại tệp hoặc lần sau khi bạn bắt đầu phiên Emacs mới, một tệp sao lưu mới sẽ được tạo. Bản sao lưu mới phản ánh nội dung của tệp sau khi mở lại hoặc khi bắt đầu các phiên chỉnh sửa. Nhưng một bản sao lưu hiện có không bao giờ được chạm lại. Do đó, tôi thấy hữu ích khi tạo các bản sao lưu được đánh số (xem cấu hình bên dưới).

Để tạo bản sao lưu rõ ràng sử dụng save-buffer( C-x C-s) với các đối số tiền tố.

diff-backupdired-diff-backupso sánh một tập tin với bản sao lưu của nó hoặc ngược lại. Nhưng không có chức năng để khôi phục các tập tin sao lưu. Ví dụ: trong Windows, để khôi phục tệp sao lưu

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

nó phải được sao chép thủ công như

C:\Users\USERNAME\.emacs.el

Tự động lưu tập tin

Tự động lưu tệp sử dụng dấu băm ( #) và sẽ được ghi cục bộ trong thư mục dự án (cùng với các tệp thực tế). Lý do là các tệp tự động lưu chỉ là các tệp tạm thời mà Emacs tạo cho đến khi một tệp được lưu lại (như với sự vâng lời vội vàng).

  • Trước khi người dùng nhấn C-x C-s( save-buffer) để lưu tệp Emacs tự động lưu tệp - dựa trên việc đếm tổ hợp phím ( auto-save-interval) hoặc khi bạn dừng nhập ( auto-save-timeout).
  • Emacs cũng tự động lưu bất cứ khi nào nó gặp sự cố, bao gồm cả việc giết công việc Emacs bằng lệnh shell.

Khi người dùng lưu tệp, phiên bản tự động lưu sẽ bị xóa. Nhưng khi người dùng thoát tệp mà không lưu tệp, Emacs hoặc phiên X gặp sự cố, các tệp tự động lưu vẫn tồn tại.

Sử dụng revert-bufferhoặc recover-fileđể khôi phục các tập tin tự động lưu. Lưu ý rằng bản ghi Emacs bị gián đoạn phiên để phục hồi sau này trong các tệp có tên ~ / .emacs.d / auto-save-list . Các recover-sessionchức năng sẽ sử dụng thông tin này.

Phương pháp ưa thích để khôi phục từ tệp được lưu tự động là M-x revert-buffer RET. Emacs sẽ hỏi "Bộ đệm đã được lưu tự động gần đây. Hoàn nguyên từ tệp tự động lưu?" hoặc "Hoàn nguyên bộ đệm từ tệp FILENAME?". Trong trường hợp sau này không có tệp tự động lưu. Ví dụ: vì bạn đã lưu trước khi nhập một auto-save-intervalltổ hợp phím khác , trong trường hợp đó, Emacs đã xóa tệp tự động lưu.

Tự động lưu hiện nay bị tắt theo mặc định vì nó có thể làm chậm chỉnh sửa khi được kết nối với máy chậm và vì nhiều tệp chứa dữ liệu nhạy cảm.

Cấu hình

Đây là một cấu hình mà IMHO hoạt động tốt nhất:

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

Dữ liệu nhạy cảm

Một vấn đề khác là bạn không muốn Emacs phát tán các bản sao của tệp có dữ liệu nhạy cảm. Sử dụng chế độ này trên cơ sở mỗi tệp. Vì đây là chế độ nhỏ, vì mục đích của tôi, tôi đã đổi tên nó sensitive-minor-mode.

Để kích hoạt nó cho tất cả các tệp .vcf.gpg , trong .emacs của bạn sử dụng một cái gì đó như:

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

Ngoài ra, để chỉ bảo vệ một số tệp, như một số tệp .txt , hãy sử dụng một dòng như

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

trong file.


Vì vậy, bạn không sử dụng tự động? Các cài đặt này cho phép bạn tránh phải xem các tệp # filename.tex # khó chịu trong thư mục của mình?
PascalVKooten

3
Tôi luôn sử dụng các tệp tự động và sao lưu theo mặc định, ngoại trừ các tệp có dữ liệu nhạy cảm. Chế độ nhạy cảm vô hiệu hóa tự động lưu và sao lưu. Các tệp BTW, # file.ext # không thực sự khó chịu, vì Emacs tạo và xóa chúng khi cần. Nếu chúng vẫn còn Emacs vẫn đang chạy, hoặc chúng là một vật phẩm từ một Emacs bị rơi. Trong cả hai trường hợp, họ có thể tiết kiệm trong ngày ;-)
Andreas Spindler

Ah, cảm ơn vì thông tin thêm. Tôi thực sự có kinh nghiệm tích cực với họ (họ đã cứu ngày của tôi). Chỉ khi bạn đang tìm kiếm sự xấu xí, bạn mới có nó ngay tại đó :)
PascalVKooten

BTW đó là một điều để tạo bản sao lưu, và một điều khác để khôi phục bản sao lưu. Do đó chơi với tự động lưu. Giết công việc Emacs hoặc phiên ssh. Nếu có một tập tin tự động lưu diffnó với tập tin thực tế. Sau đó, bắn Emacs và tự mình tìm ra những gì revert-buffer. Điều này sẽ trả hết nhanh chóng trong trường hợp khẩn cấp.
Andreas Spindler

Chế độ nhạy cảm hoạt động tuyệt vời. Cảm ơn. Xin lưu ý rằng trong bài đăng của bạn, bạn gọi nó là chế độ nhạy cảm nhỏ trong khi trong định nghĩa (liên kết), nó được gọi là chế độ nhạy cảm. Có lẽ bạn muốn căn chỉnh điều đó.
HeyMan

65

Các câu trả lời được chấp nhận là tốt, nhưng nó có thể được cải thiện đáng kể bằng cách bổ sung sao lưu trên mỗi tiết kiệm và sao lưu phiên bản file .

Đầu tiên, cài đặt cơ bản như được mô tả trong câu trả lời được chấp nhận :

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

Tiếp theo, cũng sao lưu các tệp được phiên bản, mà Emacs không làm theo mặc định (bạn không cam kết mỗi lần lưu, phải không?):

(setq vc-make-backup-files t)

Cuối cùng, tạo một bản sao lưu trên mỗi lần lưu, không chỉ lần đầu tiên. Chúng tôi thực hiện hai loại sao lưu:

  1. sao lưu mỗi phiên: một lần vào lần lưu đầu tiên của bộ đệm trong mỗi phiên Emacs. Chúng mô phỏng hành vi sao lưu mặc định của Emac.

  2. sao lưu mỗi lần lưu: một lần vào mỗi lần lưu. Emacs không làm điều này theo mặc định, nhưng nó rất hữu ích nếu bạn để Emacs chạy trong một thời gian dài.

Các bản sao lưu đi ở những nơi khác nhau và Emacs tự động tạo các thư mục sao lưu nếu chúng không tồn tại:

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

Tôi đã trở nên rất quan tâm đến chủ đề này sau khi tôi viết $<thay vì $@trong tôi Makefile, khoảng ba giờ sau khi cam kết trước đó của tôi: P

Trên đây là dựa trên một trang Wiki Emacs tôi đã chỉnh sửa rất nhiều .


Tôi đã dán đoạn mã trên trong tệp init.el của mình, nhưng tôi không nhận được bất kỳ thư mục sao lưu nào và emacs vẫn tạo các tệp sao lưu khắp nơi. Tôi có thể đã hiểu nhầm điều gì đó, tôi mới biết về emacs: P
Soeholm

@Soeholm: bạn đã dán tất cả các mã vào câu trả lời của tôi, bao gồm cả setqs ở đầu câu trả lời của tôi? Các công việc trên cho tôi trong Emacs 24.5.1.
ntc2

Nó bắt đầu làm việc bây giờ. Tôi đã có tất cả các mã được dán vào, vì vậy tôi không chắc tại sao nó chậm chấp nhận cấu hình mới của tôi. Nhưng cảm ơn rất nhiều!
Soeholm

1
Theo dõi, tôi biết tại sao nó không hoạt động. Nó hoạt động trên một máy, nhưng không phải máy khác. Đó là bởi vì tôi có một tệp .emacs trống trong thư mục nhà của tôi, nó được ưu tiên hơn thư mục .emacs.d của tôi. Sai lầm ngớ ngẩn ..
Soeholm

31

Một cách khác để cấu hình các tùy chọn sao lưu là thông qua giao diện Tùy chỉnh. Đi vào:

M-x customize-group

Và sau đó tại Customize group:dấu nhắc nhập backup.

Nếu bạn cuộn xuống dưới cùng của bộ đệm, bạn sẽ thấy Alist Directory Directory . Nhấp vào Hiển thị giá trị và đặt mục nhập đầu tiên của danh sách như sau:

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

Ngoài ra, bạn có thể tắt sao lưu thiết lập của tôi Tạo tệp sao lưu thành off.

Nếu bạn không muốn Emacs tự động chỉnh sửa .emacstệp của mình, bạn sẽ muốn thiết lập tệp tùy chỉnh .


4
Tôi ước tôi đã biết khoảng customize-group2 năm trước. Cảm ơn bạn!
wprl

30

Bạn có thể vô hiệu hóa chúng hoàn toàn bằng cách

(setq make-backup-files nil)

Tôi muốn đặt cái này từ dấu nhắc shell, khi tôi nhảy từ máy chủ này sang máy chủ khác, tôi không muốn có các tệp .emacs: emacs --eval "(setq make-backup-files nil)"
Dave Morse
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.