ฉันจะควบคุมวิธีที่ 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 ระบบควบคุมเวอร์ชันที่ดีและวิธีการเขียนโปรแกรมควรทำการสำรองไฟล์แต่ละไฟล์โดยตัวแก้ไข
vol7ron

52
@ vol7ron: การสำรองข้อมูลมีไว้สำหรับเมื่อคุณกำลังแก้ไขบางสิ่งที่ไม่ได้อยู่ภายใต้การควบคุมเวอร์ชัน - เช่นไฟล์กำหนดค่าหรือบางสิ่งที่รวดเร็วและสกปรกซึ่งคุณยังไม่ได้ใช้ในการควบคุมเวอร์ชัน จากนั้นเมื่อคุณไม่ได้ทำในสิ่งที่ควรจะเป็นบรรณาธิการจะบันทึกที่คอของคุณ
Eponymous

69
@ vol7ron - มันผิดปกติ คุณไม่ควรใส่อึลงในการควบคุมการแก้ไขที่คุณไม่ต้องการเก็บไว้ มันทำให้การค้นหาสิ่งสำคัญ ๆ ยากขึ้น ให้ใช้การสำรองข้อมูลเอดิเตอร์ของคุณสำหรับสิ่งที่ดีสำหรับ (สำรองการเปลี่ยนแปลงในกรณีฉุกเฉิน) และการควบคุมการแก้ไขใหม่สำหรับสิ่งที่ดี (เก็บซอฟต์แวร์เวอร์ชันที่สำคัญของคุณและอำนวยความสะดวกในการพัฒนาทีม) ใช้เครื่องมือที่เหมาะสมสำหรับงาน
TED

26
"ไฟล์สำรองเพิ่มค่าใช้จ่ายมากและแทบไม่มีค่า": นั่นไม่ใช่การตัดสินหรือ?
แปรปรวนแปรปรวน

70

ไฟล์สำรองข้อมูล / บันทึกอัตโนมัติของ Emacs มีประโยชน์มาก แต่คุณสมบัติเหล่านี้ทำให้เกิดความสับสน

สำรองไฟล์

ไฟล์สำรองมีตัวหนอน ( ~หรือ~9~) ท้ายและจะถูกเขียนไปยังไดเรกทอรีบ้านของผู้ใช้ เมื่อmake-backup-filesNon-nil 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 ( #) และจะต้องเขียนไว้ในไดเรกทอรีโครงการ (พร้อมกับไฟล์จริง) เหตุผลก็คือไฟล์บันทึกอัตโนมัติเป็นเพียงไฟล์ชั่วคราวที่ Emac สร้างขึ้นจนกว่าไฟล์จะได้รับการบันทึกอีกครั้ง (เช่นด้วยการเชื่อฟังอย่างรวดเร็ว)

  • ก่อนที่ผู้ใช้จะกดC-x C-s( save-buffer) เพื่อบันทึกไฟล์ Emacs จะทำการบันทึกไฟล์โดยอัตโนมัติ - ตามการกดแป้นนับ ( auto-save-interval) หรือเมื่อคุณหยุดพิมพ์ ( auto-save-timeout)
  • Emacs ยังบันทึกอัตโนมัติเมื่อใดก็ตามที่เกิดปัญหารวมถึงการฆ่างาน Emacs ด้วยคำสั่งเชลล์

เมื่อผู้ใช้บันทึกไฟล์เวอร์ชันที่บันทึกอัตโนมัติจะถูกลบ แต่เมื่อผู้ใช้ออกจากไฟล์โดยไม่บันทึกไฟล์ Emacs หรือเซสชัน X ล่มไฟล์ที่บันทึกอัตโนมัติจะยังคงมีอยู่

ใช้revert-bufferหรือrecover-fileเพื่อกู้คืนไฟล์บันทึกอัตโนมัติ โปรดทราบว่า Emacs บันทึกการประชุมขัดจังหวะสำหรับการกู้คืนในภายหลังในชื่อไฟล์~ / .emacs.d / อัตโนมัติบันทึกรายการ 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ทั้งหมดใน. emacของคุณให้ใช้สิ่งต่อไปนี้:

(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
ฉันจะใช้การบันทึกอัตโนมัติและไฟล์สำรองตามค่าเริ่มต้นเสมอยกเว้นไฟล์ที่มีข้อมูลที่ละเอียดอ่อน โหมด Sensitive จะปิดใช้งานการบันทึกอัตโนมัติและสำรองข้อมูล BTW, # file.ext # files ไม่น่ารังเกียจจริงๆเพราะ Emacs สร้างและลบไฟล์ตามต้องการ หากพวกเขายังคงอยู่ Emacs ยังคงทำงานอยู่หรือพวกเขาเป็นสิ่งประดิษฐ์จาก Emac ที่ล้มเหลว ในทั้งสองกรณีพวกเขาสามารถบันทึกวัน ;-)
Andreas Spindler

อาขอบคุณสำหรับข้อมูลพิเศษนั้น ฉันมีประสบการณ์เชิงบวกกับพวกเขาเป็นส่วนใหญ่ (พวกเขาช่วยชีวิตฉันไว้) เฉพาะเมื่อคุณกำลังมองหาอัปลักษณ์ที่ดีที่คุณได้มันขวามี :)
PascalVKooten

BTW เป็นสิ่งหนึ่งที่จะทำการสำรองข้อมูลและเป็นสิ่งที่แตกต่างในการกู้คืนการสำรองข้อมูล ดังนั้นเล่นด้วยการบันทึกอัตโนมัติ ฆ่างาน Emacs หรือเซสชัน ssh หากมีไฟล์บันทึกอัตโนมัติพร้อมไฟล์diffจริง จากนั้นทำการยิง Emacs และค้นหาด้วยตัวเองว่าrevert-bufferทำอะไร สิ่งนี้จะจ่ายเร็วในกรณีฉุกเฉิน
Andreas Spindler

โหมดความไวใช้งานได้ดี ขอบคุณ โปรดทราบว่าในโพสต์ของคุณคุณเรียกว่าโหมดที่ละเอียดอ่อนเล็กน้อยในขณะที่ในความหมาย (ลิงค์) จะเรียกว่าโหมดที่ละเอียดอ่อน บางทีคุณอาจต้องการจัดตำแหน่งที่
HeyMan

65

คำตอบที่ได้รับการยอมรับเป็นสิ่งที่ดี แต่ก็สามารถปรับตัวดีขึ้นอย่างมากโดยเพิ่มการสำรองข้อมูลใน ทุกการบันทึกและการสำรองversionedไฟล์

ก่อนการตั้งค่าพื้นฐานตามที่อธิบายไว้ในคำตอบที่ยอมรับ :

(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
ในฐานะผู้ติดตามฉันรู้ว่าทำไมตอนนี้จึงไม่ทำงาน มันใช้งานได้กับเครื่องหนึ่ง แต่ไม่ทำงาน เป็นเพราะฉันมีไฟล์. emac ว่างเปล่าในโฮมไดเร็กตอรี่ของฉันซึ่งมีลำดับความสำคัญมากกว่าไดเร็กตอรี่. emacs.d ของฉัน ความผิดพลาดโง่ ๆ ..
Soeholm

31

อีกวิธีหนึ่งในการกำหนดค่าตัวเลือกการสำรองข้อมูลคือผ่านทางส่วนต่อประสานที่กำหนดเอง Enter:

M-x customize-group

และแล้วที่พรอมต์ให้ป้อนCustomize group:backup

หากคุณเลื่อนไปด้านล่างของกันชนที่คุณจะเห็นการสำรองข้อมูลไดเรกทอรี alist คลิกแสดงค่าและตั้งค่ารายการแรกของรายการดังนี้:

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

หรือคุณสามารถเปิดการสำรองข้อมูลปิดการตั้งค่าของฉันทำไฟล์สำรองข้อมูลoffไปยัง

หากคุณไม่ต้องการที่จะแก้ไข Emacs ของคุณโดยอัตโนมัติ.emacsไฟล์ที่คุณจะต้องการที่จะตั้งค่าการปรับแต่งไฟล์


4
ฉันหวังว่าฉันจะรู้ประมาณcustomize-group2 ปีที่ผ่านมา ขอบคุณ!
wprl

30

คุณสามารถปิดการใช้งานทั้งหมดโดย

(setq make-backup-files nil)

ฉันต้องการตั้งค่านี้จาก shell prompt เมื่อฉันกระโดดจากโฮสต์ไปยังโฮสต์ฉันไม่ต้องการมีไฟล์. emacs: emacs --eval "(setq make-backup-files ไม่มีศูนย์)"
Dave Morse
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.