Bagaimana cara mengontrol bagaimana Emacs membuat file cadangan?

327

Emacs menempatkan file cadangan bernama di foo~mana-mana dan saya tidak suka harus ingat untuk menghapusnya. Juga, jika saya mengedit file yang memiliki tautan keras di tempat lain dalam sistem file, tautan keras menunjuk ke cadangan ketika saya selesai mengedit, dan itu membingungkan dan mengerikan. Bagaimana saya bisa menghilangkan file cadangan ini, atau meminta mereka pergi ke tempat lain selain direktori yang sama?

jfm3
sumber

Jawaban:

519

Jika Anda pernah diselamatkan oleh file cadangan Emacs, Anda mungkin menginginkan lebih banyak, tidak sedikit. Sangat menjengkelkan karena mereka masuk dalam direktori yang sama dengan file yang Anda edit, tetapi itu mudah diubah. Anda dapat membuat semua file cadangan masuk ke direktori dengan meletakkan sesuatu seperti yang berikut di blog Anda .emacs.

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

Ada sejumlah detail misterius yang terkait dengan bagaimana Emacs dapat membuat file cadangan Anda. Haruskah itu mengganti nama aslinya dan menulis buffer yang diedit? Bagaimana jika yang asli ditautkan? Secara umum, taruhan paling aman tetapi paling lambat adalah selalu membuat cadangan dengan menyalin.

(setq backup-by-copying t)

Jika itu terlalu lambat untuk beberapa alasan Anda mungkin juga perlu melihatnya backup-by-copying-when-linked.

Karena cadangan Anda semuanya ada di tempatnya sendiri sekarang, Anda mungkin menginginkan lebih banyak, bukan lebih sedikit. Lihat dokumentasi Emacs untuk variabel-variabel ini (dengan C-h v).

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

Terakhir, jika Anda benar-benar tidak boleh memiliki file cadangan:

(setq make-backup-files nil)

Itu membuat saya muak memikirkannya.

jfm3
sumber
6
hei tapi itu membuat backup dengan nama seperti ini! home! svradmin! foo ~ dan saya tidak bisa membuka file
Jaime Hablutzel
33
mengapa menggunakan cadangan? mengapa tidak menggunakan git / lincah? sistem kontrol versi yang baik dan metodologi pemrograman harus mengalahkan cadangan file individual oleh editor
vol7ron
52
@ vol7ron: Cadangan adalah untuk saat Anda mengedit sesuatu yang tidak di bawah kontrol versi - seperti file konfigurasi atau sesuatu yang cepat dan kotor yang belum sempat Anda masukkan ke dalam kontrol versi. Kemudian, ketika Anda belum melakukan apa yang seharusnya, editor menyimpan leher Anda.
Eponim
69
@ vol7ron - Itu salah. Anda seharusnya tidak memasukkan kontrol revisi yang tidak ingin Anda pertahankan. Itu hanya membuat menemukan hal-hal penting menjadi lebih sulit. Alih-alih, gunakan cadangan editor Anda untuk apa manfaatnya (mendukung perubahan jika terjadi keadaan darurat) dan kontrol revisi untuk apa manfaatnya (menjaga versi penting perangkat lunak Anda dan memfasilitasi pengembangan tim). Gunakan alat yang tepat untuk pekerjaan itu.
TED
26
"File cadangan menambah banyak overhead dan hampir tidak ada nilai": bukankah itu menghakimi?
Variabel sengsara
70

File cadangan / penyimpanan otomatis Emacs bisa sangat membantu. Tetapi fitur-fitur ini membingungkan.

Cadangkan file

File cadangan memiliki tildes ( ~atau ~9~) di bagian akhir dan akan ditulis ke direktori home pengguna. Ketika make-backup-filesnon-nil Emacs secara otomatis membuat cadangan dari file asli saat pertama kali file disimpan dari buffer. Jika Anda mengedit file baru, Emacs akan membuat cadangan saat Anda menyimpan file kedua kali.

Tidak peduli berapa kali Anda menyimpan file, cadangan tetap tidak berubah. Jika Anda membunuh buffer dan kemudian mengunjungi file lagi, atau waktu berikutnya Anda memulai sesi Emacs baru, file cadangan baru akan dibuat. Cadangan baru mencerminkan konten file setelah dibuka kembali, atau pada awal sesi pengeditan. Tetapi cadangan yang ada tidak pernah disentuh lagi. Karena itu saya merasa berguna untuk membuat cadangan bernomor (lihat konfigurasi di bawah).

Untuk membuat cadangan gunakan secara eksplisit save-buffer( C-x C-s) dengan argumen awalan.

diff-backupdan dired-diff-backupmembandingkan file dengan cadangannya atau sebaliknya. Tetapi tidak ada fungsi untuk mengembalikan file cadangan. Misalnya, di bawah Windows, untuk mengembalikan file cadangan

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

itu harus disalin secara manual sebagai

C:\Users\USERNAME\.emacs.el

Simpan file secara otomatis

Simpan otomatis file menggunakan tanda pagar ( #) dan akan ditulis secara lokal di dalam direktori proyek (bersama dengan file yang sebenarnya). Alasannya adalah bahwa file simpan otomatis hanya file sementara yang dibuat Emacs hingga file disimpan lagi (seperti dengan kepatuhan yang terburu-buru).

  • Sebelum pengguna menekan C-x C-s( save-buffer) untuk menyimpan file, Emacs menyimpan file secara otomatis - berdasarkan penghitungan penekanan tombol ( auto-save-interval) atau ketika Anda berhenti mengetik ( auto-save-timeout).
  • Emacs juga menyimpan secara otomatis setiap kali crash, termasuk membunuh pekerjaan Emacs dengan perintah shell.

Saat pengguna menyimpan file, versi yang disimpan otomatis dihapus. Tetapi ketika pengguna keluar dari file tanpa menyimpannya, Emacs atau sesi X crash, file yang disimpan secara otomatis masih ada.

Gunakan revert-bufferatau recover-fileuntuk mengembalikan file simpan otomatis. Perhatikan bahwa catatan Emacs sesi terputus untuk pemulihan nanti dalam file bernama ~ / .emacs.d / auto-save-list . The recover-sessionfungsi akan menggunakan informasi ini.

Metode yang disukai untuk memulihkan dari arsip yang disimpan secara otomatis adalah M-x revert-buffer RET. Emacs akan bertanya, "Buffer telah disimpan otomatis baru-baru ini. Kembalikan dari simpan otomatis file?" atau "Kembalikan buffer dari file FILENAME?". Dalam hal yang terakhir tidak ada file simpan otomatis. Misalnya, karena Anda telah menyimpan sebelum mengetik auto-save-intervallpenekanan tombol lain , dalam hal ini Emacs telah menghapus file simpan otomatis.

Auto-save saat ini dinonaktifkan secara default karena dapat memperlambat pengeditan saat terhubung ke mesin yang lambat, dan karena banyak file berisi data sensitif.

Konfigurasi

Berikut adalah konfigurasi yang paling baik digunakan 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)
      )

Data sensitif

Masalah lain adalah Anda tidak ingin Emacs menyebarkan salinan file dengan data sensitif. Gunakan mode ini berdasarkan per file. Karena ini adalah mode minor, untuk keperluan saya, saya menamainya kembali sensitive-minor-mode.

Untuk mengaktifkannya untuk semua file .vcf dan .gpg , di .emac Anda gunakan sesuatu seperti:

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

Atau, untuk melindungi hanya beberapa file, seperti beberapa file .txt , gunakan baris seperti

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

dalam file.

Andreas Spindler
sumber
Jadi Anda tidak menggunakan penyimpanan otomatis? Pengaturan ini memungkinkan Anda untuk menghindari melihat file-file # filename.tex # jahat di folder Anda?
PascalVKooten
3
Saya selalu menggunakan file penyimpanan otomatis dan cadangan secara default, kecuali file dengan data sensitif. Mode sensitif menonaktifkan penyimpanan otomatis dan cadangan. BTW, # file.ext # file tidak terlalu jahat, karena Emacs membuat dan menghapusnya sesuai kebutuhan. Jika mereka tetap Emacs masih berjalan, atau mereka adalah artefak dari Emacs yang mogok. Dalam kedua kasus mereka dapat menyelamatkan hari ;-)
Andreas Spindler
Ah, terima kasih atas informasi tambahan itu. Saya memang memiliki sebagian besar pengalaman positif dengan mereka (mereka menyelamatkan hari saya). Hanya ketika Anda mencari kejelekan, Anda berhasil melakukannya :)
PascalVKooten
BTW itu adalah satu hal untuk membuat cadangan, dan hal yang berbeda untuk mengembalikan cadangan. Maka mainkan dengan simpan otomatis. Bunuh pekerjaan atau sesi ssh Emacs. Jika ada file simpan otomatis dengan file diffyang sebenarnya. Lalu tembak Emacs dan cari tahu sendiri apa yang revert-bufferdilakukannya. Ini akan membayar dengan cepat jika terjadi keadaan darurat.
Andreas Spindler
Mode sensitif berfungsi dengan baik. Terima kasih. Harap dicatat bahwa dalam posting Anda, Anda menyebutnya mode sensitif-minor sedangkan dalam definisi (tautan) disebut mode sensitif. Mungkin Anda ingin menyelaraskan itu.
HeyMan
65

The jawaban yang diterima baik, tetapi dapat sangat ditingkatkan dengan tambahan back up pada setiap menyimpan dan back up berversi file .

Pertama, pengaturan dasar seperti yang dijelaskan dalam jawaban yang diterima :

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

Selanjutnya, juga buat cadangan file berversi, yang Emacs tidak lakukan secara default (Anda tidak melakukan setiap save, kan?):

(setq vc-make-backup-files t)

Akhirnya, buat cadangan pada setiap penyimpanan, bukan hanya yang pertama. Kami membuat dua jenis cadangan:

  1. backup per-sesi: sekali pada penyimpanan pertama buffer di setiap sesi Emacs. Ini mensimulasikan perilaku cadangan default Emac.

  2. cadangan per-simpan: sekali di setiap penyimpanan. Emacs tidak melakukan ini secara default, tetapi sangat berguna jika Anda membiarkan Emacs berjalan lama.

The backup pergi di tempat yang berbeda dan Emacs menciptakan dirs cadangan otomatis jika mereka tidak ada:

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

Saya menjadi sangat tertarik dengan topik ini setelah saya menulis dan $<bukannya $@di dalam saya Makefile, sekitar tiga jam setelah komit saya sebelumnya: P

Di atas didasarkan pada halaman Wiki Emacs yang saya sunting .

ntc2
sumber
Saya menempelkan kode di atas di dalam file init.el saya, namun saya tidak mendapatkan direktori cadangan dan emacs masih membuat semua file cadangan. Saya mungkin salah paham sesuatu, saya baru
mengenal
@ Soeholm: apakah Anda menempelkan semua kode dalam jawaban saya, termasuk setqs di bagian atas jawaban saya? Di atas berfungsi untuk saya di Emacs 24.5.1.
ntc2
Itu mulai bekerja sekarang. Saya telah menyisipkan semua kode, jadi saya tidak yakin mengapa lambat untuk menerima konfigurasi baru saya. Tapi terima kasih banyak!
Soeholm
1
Sebagai tindak lanjut, saya tahu mengapa itu tidak berhasil sekarang. Ini bekerja pada satu mesin, tetapi tidak pada yang lain. Itu karena saya memiliki file .emacs kosong di direktori home saya, yang mengambil prioritas di atas direktori .emacs.d saya. Kesalahan konyol ..
Soeholm
31

Cara lain untuk mengonfigurasi opsi cadangan adalah melalui antarmuka Kustomisasi. Memasukkan:

M-x customize-group

Dan kemudian pada Customize group:prompt masuk backup.

Jika Anda menggulir ke bagian bawah buffer Anda akan melihat Backup Directory Alist . Klik Tampilkan Nilai dan atur entri pertama dari daftar sebagai berikut:

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

Atau, Anda dapat mengubah backup off pengaturan saya Membuat Backup File ke off.

Jika Anda tidak ingin Emacs mengedit .emacsfile Anda secara otomatis, Anda ingin mengatur file penyesuaian .

Dave Webb
sumber
4
Seandainya saya tahu sekitar customize-group2 tahun yang lalu. Terima kasih!
wprl
30

Anda dapat menonaktifkannya sama sekali dengan

(setq make-backup-files nil)
Paweł Hajdan
sumber
Saya suka mengatur ini dari prompt shell, ketika saya melompat dari host ke host saya tidak suka memiliki file .emacs: emacs --eval "(setq make-backup-file nil)"
Dave Morse