Emacs'ın yedekleme dosyalarını nasıl oluşturduğunu nasıl kontrol ederim?


326

Emacs, yedekleme dosyalarını foo~her yere koyar ve bunları silmeyi hatırlamak zorunda kalmam. Ayrıca, dosya sisteminde başka bir yerde sabit bağlantısı olan bir dosyayı düzenlersem, düzenleme işlemi bittiğinde sabit bağlantı yedeklemeyi gösterir ve bu kafa karıştırıcı ve korkunçtur. Bu yedekleme dosyalarını nasıl kaldırabilirim veya aynı dizinden başka bir yere gitmelerini nasıl sağlayabilirim?

Yanıtlar:


518

Bir Emacs yedek dosyası tarafından kaydedildiyseniz, muhtemelen daha azını değil, daha fazlasını istersiniz. Düzenlediğiniz dosyayla aynı dizine gitmeleri can sıkıcıdır, ancak bu kolayca değiştirilebilir. Tüm yedekleme dosyalarının aşağıdaki gibi bir şey koyarak bir dizine girmesini sağlayabilirsiniz .emacs.

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

Emacs'ın yedekleme dosyalarınızı nasıl oluşturabileceği ile ilgili bir dizi gizli bilgi vardır. Orijinali yeniden adlandırmalı ve düzenlenen arabelleği yazmalı mı? Orijinal bağlanırsa ne olur? Genel olarak, en güvenli ancak en yavaş bahis her zaman kopyalayarak yedekleme yapmaktır.

(setq backup-by-copying t)

Eğer bu herhangi bir nedenden ötürü çok yavaşsa da bir göz atabilirsiniz backup-by-copying-when-linked.

Yedeklemeleriniz artık kendi yerlerinde olduğundan, daha azı yerine daha fazlasını isteyebilirsiniz. Bu değişkenler için Emacs belgelerine göz atın (ile C-h v).

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

Son olarak, kesinlikle hiçbir yedek dosyanız yoksa:

(setq make-backup-files nil)

Yine de düşünmek beni hasta ediyor.


6
hey ama bunun gibi bir adla yedekler oluşturuyor! home! svradmin! foo ~ ve dosyayı açamıyorum
Jaime Hablutzel

33
neden yedekleri kullanmalıyım? neden git / mercurial kullanmıyorsunuz? iyi sürüm kontrol sistemleri ve programlama metodolojileri editör tarafından bireysel dosya yedeklemesini trump etmelidir
vol7ron

52
@ vol7ron: Yedeklemeler, sürüm kontrolü altında olmayan bir şeyi (yapılandırma dosyası veya henüz sürüm kontrolüne sokmak için uğraşmadığınız hızlı ve kirli bir şey gibi) düzenlerken kullanılır. Sonra, ne yapmanız gerektiğini yapmadığınızda, editör boynunuzu kurtarır.
İsimsiz

69
@ vol7ron - Bu sadece yanlış. Saklamak istemediğiniz revizyon kontrolüne bok koymamalısınız. Sadece önemli şeyleri bulmayı zorlaştırıyor. Bunun yerine, editör yedeklemelerinizi iyi durumları için (acil durumlarda değişiklikleri yedekleyin) ve ne işe yaradıklarına yönelik revizyon kontrolünü (yazılımınızın önemli sürümlerini tutmak ve ekip gelişimini kolaylaştırmak için) kullanın. İş için doğru aracı kullanın.
TED

26
"Yedekleme dosyaları çok fazla yük getirir ve neredeyse hiç değer kalamaz": bu yargılama değil mi?
Sefil Değişken

70

Emacs yedekleme / otomatik kaydetme dosyaları çok yardımcı olabilir. Ancak bu özellikler kafa karıştırıcı.

Yedekleme dosyaları

Yedekleme dosyalarının sonunda tild ( ~veya ~9~) vardır ve kullanıcının giriş dizinine yazılır. Ne zaman make-backup-filesolmayan nil Emacs otomatik orijinal dosya dosya bir tampon kaydedilen ilk kez bir yedeğini oluşturur. Yeni bir dosya düzenliyorsanız, dosyayı ikinci kez kaydettiğinizde Emacs yedek oluşturur.

Dosyayı kaç kez kaydettiğiniz önemli değil, yedekleme değişmeden kalır. Arabelleği öldürüp dosyayı yeniden ziyaret ederseniz veya bir sonraki Emacs oturumu başlattığınızda yeni bir yedekleme dosyası oluşturulur. Yeni yedekleme, yeniden açıldıktan sonra veya oturumların başlangıcında dosyanın içeriğini yansıtır. Ancak mevcut bir yedeklemeye bir daha asla dokunulmaz. Bu nedenle numaralandırılmış yedeklemeler oluşturmayı yararlı buluyorum (aşağıdaki yapılandırmaya bakın).

Yedek oluşturmak için önek bağımsız değişkenleriyle açıkça save-buffer( C-x C-s) kullanın .

diff-backupve dired-diff-backupbir dosyayı yedeklemesiyle veya tam tersini karşılaştırır. Ancak yedekleme dosyalarını geri yükleme işlevi yoktur. Örneğin, Windows altında, bir yedekleme dosyasını geri yüklemek için

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

manuel olarak kopyalanmalıdır

C:\Users\USERNAME\.emacs.el

Dosyaları otomatik kaydet

Dosyaları otomatik kaydetme hashmarks ( #) kullanır ve proje dizininde yerel olarak yazılır (gerçek dosyalarla birlikte). Bunun nedeni, otomatik kaydetme dosyalarının Emacs'ın bir dosya tekrar kaydedilinceye kadar oluşturduğu geçici dosyalar olmasıdır (itaat etmek gibi).

  • Kullanıcı bir dosyayı kaydetmek için C-x C-s( save-buffer) düğmesine basmadan önce Emacs, tuş vuruşlarını ( auto-save-interval) saymaya dayalı olarak veya ( auto-save-timeout) yazmayı bıraktığınızda dosyaları otomatik olarak kaydeder .
  • Emacs ayrıca, çöktüğünde otomatik olarak kaydeder; Emacs işini bir kabuk komutuyla öldürmek de dahil.

Kullanıcı dosyayı kaydettiğinde, otomatik kaydedilen sürüm silinir. Ancak kullanıcı dosyayı kaydetmeden çıktığında, Emacs veya X oturumu çöküyorsa, otomatik kaydedilen dosyalar hala var olur.

Otomatik kaydetme dosyalarını geri yüklemek için revert-bufferveya recover-filedüğmesini kullanın . Emacs'ın ~ / .emacs.d / auto-save-list adlı dosyalarda daha sonra kurtarma için kesilen oturumları kaydettiğini unutmayın . recover-sessionFonksiyon bu bilgileri kullanacağız.

Otomatik kaydedilen bir dosyadan kurtarmak için tercih edilen yöntemdir M-x revert-buffer RET. Emacs, "Arabellek yakın zamanda otomatik olarak kaydedildi. Otomatik kaydetme dosyasından geri dönülsün mü?" veya "FILENAME dosyasından arabelleği geri al?". İkincisi durumunda otomatik kaydetme dosyası yoktur. Örneğin, başka bir auto-save-intervalltuş vuruşu yazmadan önce kaydettiğiniz için Emacs otomatik kaydetme dosyasını silmişti.

Otomatik kaydetme günümüzde varsayılan olarak devre dışıdır, çünkü yavaş bir makineye bağlandığında düzenlemeyi yavaşlatabilir ve birçok dosya hassas veriler içerdiğinden.

Yapılandırma

IMHO'nun en iyi çalıştığı yapılandırma:

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

Hassas veri

Başka bir sorun, Emacs'ın hassas veriler içeren dosyaların kopyalarını yaymasını istememenizdir. Bu modu dosya başına kullanın . Bu küçük bir mod olduğu için, amaçlarım için yeniden adlandırdım sensitive-minor-mode.

Tüm .vcf ve .gpg dosyaları için etkinleştirmek üzere .emacs dosyasında şöyle bir şey kullanın:

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

Alternatif olarak, yalnızca .txt dosyaları gibi yalnızca bazı dosyaları korumak için,

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

dosyanın içinde.


Yani otomatik kaydetme kullanmıyorsunuz? Bu ayarlar klasörünüzdeki kötü # dosyaadı.tex # dosyalarını görmekten kaçınmanıza izin verir mi?
PascalVKooten

3
Hassas verileri olan dosyalar hariç, her zaman varsayılan olarak otomatik kaydetme ve yedekleme dosyaları kullanırım. Hassas mod otomatik kaydetmeyi ve yedeklemeleri devre dışı bırakır. BTW, # file.ext # dosyaları gerçekten kötü değil, çünkü Emacs bunları gerektiği gibi oluşturur ve siler. Ya kalırsa Emacs hala çalışıyor ya da çökmüş bir Emacs'ın eseri. Her iki durumda da günü kurtarabilirler ;-)
Andreas Spindler

Ah, bu ekstra bilgi için teşekkürler. Gerçekten onlarla çoğunlukla olumlu bir deneyimim var (benim günümü kurtardılar). Sadece çirkinlik aradığın zaman, işte tam orada
anladın

BTW, yedekleme yapmak için bir şey ve yedeklemeleri geri yüklemek için farklı bir şeydir. Böylece otomatik kaydetme ile oynayın. Emacs işini veya ssh oturumunu öldür. Otomatik kaydetme dosyası diffvarsa, dosyayı gerçek dosyayla kaydedin . Sonra Emacs ateş ve ne revert-bufferolduğunu kendiniz öğrenin . Bu, acil durumlarda hızlı bir şekilde ödenecektir.
Andreas Spindler

Hassas mod harika çalışıyor. Teşekkürler. Gönderinizde buna duyarlı-küçük-mod adını verirken, tanımda (link) buna hassas mod olarak adlandırıldığını lütfen unutmayın. Belki de hizalamak istersiniz.
HeyMan

65

Kabul cevap iyidir, ama büyük ölçüde ek geliştirilebilir üzerinde yedeklenmesi her tasarrufu ve yedeklenmesi sürüm dosyaları .

İlk olarak, kabul edilen cevapta açıklandığı gibi temel ayarlar :

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

Ardından, Emacs'ın varsayılan olarak yapmadığı sürümlü dosyaları da yedekleyin (her kaydetmeyi taahhüt etmiyorsunuz, değil mi?):

(setq vc-make-backup-files t)

Son olarak, sadece ilk değil, her kayıt için bir yedek alın. İki çeşit yedekleme yapıyoruz:

  1. oturum başına yedeklemeler: her Emacs oturumunda arabelleğin ilk kaydında bir kez . Bunlar Emac'ın varsayılan yedekleme davranışını simüle eder.

  2. kayıt başına yedeklemeler: her kayıtta bir kez . Emacs bunu varsayılan olarak yapmaz, ancak Emacs'ı uzun süre çalışır durumda bırakırsanız çok kullanışlıdır.

Yedekleri farklı yerlerde gidip Emacs onlar var yoksa otomatik olarak yedek dirs oluşturur:

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

Bir önceki görevimden yaklaşık üç saat sonra, benim $<yerine yazdıktan sonra bu konuyla çok ilgilenmeye başladım: P$@Makefile

Yukarıdaki, yoğun bir şekilde düzenlediğim bir Emacs Wiki sayfasına dayanmaktadır .


Yukarıdaki kodu init.el dosyama yapıştırdım, ancak herhangi bir yedekleme dizini alamıyorum ve emacs hala her yerde yedek dosyaları oluşturur. Bir şeyi yanlış anlamış olabilirim, emacs için yeniyim: P
Soeholm

@Soeholm: Cevabımın en üstündeki s dahil tüm kodu cevabıma yapıştırdın setqmı? Yukarıdakiler benim için Emacs 24.5.1'de çalışıyor.
ntc2

Şimdi çalışmaya başladı. Tüm kodu yapıştırılmış vardı, bu yüzden yeni yapılandırmamı kabul etmek neden yavaş olduğundan emin değilim. Ama çok teşekkürler!
Soeholm

1
Bir takip olarak, neden şimdi işe yaramadığını biliyorum. Bir makinede çalıştı ama diğerinde değildi. Bunun nedeni, ana dizinimde boş bir .emacs dosyam olmasıydı. Bu, .emacs.d dizinime göre öncelikliydi. Aptalca bir hata ..
Soeholm

31

Yedekleme seçeneklerini yapılandırmanın başka bir yolu da Özelleştir arabirimidir. Giriş:

M-x customize-group

Ve sonra Customize group:komut istemine girin backup.

Arabellek altına kaydırırsanız, Yedekleme Dizini Listesi'ni görürsünüz . Değeri Göster'i tıklatın ve listenin ilk girişini aşağıdaki gibi ayarlayın:

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

Alternatif olarak, sen benim ayarında kapalı yedeklemeler açabilirsiniz Yedekleme Dosyalar olun etmek off.

Emacs'ın dosyanızı otomatik olarak düzenlemesini .emacsistemiyorsanız, bir özelleştirme dosyası oluşturmak istersiniz .


4
Keşke yaklaşık customize-group2 yıl önce bilseydim . Teşekkür ederim!
wprl

30

Bunları tamamen devre dışı bırakabilirsiniz.

(setq make-backup-files nil)

Bunu kabuk isteminden ayarlamak istiyorum, ana bilgisayardan ana bilgisayara atladığımda .emacs dosyalarına sahip olmak istemiyorum: emacs --eval "(setq make-backup-files nil)"
Dave Morse
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.