मैं कैसे नियंत्रित करूं कि Emacs बैकअप फाइल कैसे बनाता है?


326

Emacs foo~हर जगह नामित बैकअप फ़ाइलों को रखता है और मुझे उन्हें हटाने के लिए याद रखना पसंद नहीं है। इसके अलावा, अगर मैं एक फाइल को एडिट करता हूं, जो फाइल सिस्टम में कहीं और हार्ड लिंक है, तो हार्ड लिंक बैकअप के लिए इशारा करता है जब मैंने एडिटिंग की है, और यह भ्रामक और भयानक है। मैं या तो इन बैकअप फ़ाइलों को कैसे समाप्त कर सकता हूं, या उन्हें उसी निर्देशिका के अलावा कहीं और जाना है?

जवाबों:


518

यदि आप कभी Emacs बैकअप फ़ाइल द्वारा सहेजे गए हैं, तो आप शायद उनमें से अधिक चाहते हैं, उनमें से कम नहीं। यह कष्टप्रद है कि वे उसी निर्देशिका में जाते हैं जिस फ़ाइल को आप संपादित कर रहे हैं, लेकिन वह बदलना आसान है। आप सभी बैकअप फ़ाइलों को अपने में निम्नलिखित की तरह कुछ डालकर एक निर्देशिका में जा सकते हैं .emacs

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

Emacs आपकी बैकअप फ़ाइलों को कैसे बना सकते हैं, इसके साथ कई आर्कन विवरण जुड़े हुए हैं। क्या इसे मूल नाम बदलकर संपादित बफ़र लिखना चाहिए? यदि मूल जुड़ा हुआ है तो क्या होगा? सामान्य तौर पर, सबसे सुरक्षित लेकिन सबसे धीमी शर्त हमेशा नकल करके बैकअप बनाना है।

(setq backup-by-copying t)

यदि यह किसी कारण से बहुत धीमा है, तो आप पर भी नज़र डाल सकते हैं backup-by-copying-when-linked

चूँकि आपके सभी बैकअप अब अपनी जगह पर हैं, आप उनमें से कम के बजाय अधिक चाहते हैं। इन चर (के साथ C-h v) के लिए Emacs प्रलेखन पर एक नज़र है ।

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

अंत में, यदि आपके पास पूरी तरह से कोई बैकअप फ़ाइल नहीं होनी चाहिए:

(setq make-backup-files nil)

हालांकि यह सोचने के लिए मुझे बीमार बनाता है।


6
हे, लेकिन यह इस तरह एक नाम के साथ बैकअप बना रहा है! घर! svradmin! foo ~ और मैं फ़ाइल नहीं खोल सकता
Jaime Hablutzel

33
बैकअप का उपयोग क्यों करें? git / mercurial का उपयोग क्यों नहीं करते? अच्छा संस्करण नियंत्रण प्रणाली और प्रोग्रामिंग कार्यप्रणाली को संपादक द्वारा अलग-अलग फ़ाइल बैकअप को ट्रम्प करना चाहिए
Vol7ron

52
@ vol7ron: बैकअप तब होता है, जब आप किसी चीज को संस्करण नियंत्रण के तहत नहीं संपादित कर रहे होते हैं - जैसे कि एक विन्यास फाइल या कुछ त्वरित और गंदा जिसे आप अभी तक संस्करण नियंत्रण में डालने के लिए आस-पास नहीं पहुंचे हैं। फिर, जब आप वह नहीं कर रहे हैं जो आपको करना चाहिए, तो संपादक आपकी गर्दन बचाता है।
14

69
@ vol7ron - यह सिर्फ गलत है। आपको संशोधन नियंत्रण में बकवास नहीं रखना चाहिए जिसे आप नहीं रखना चाहते हैं। यह सिर्फ महत्वपूर्ण सामान रास्ता कठिन बना देता है। इसके बजाय, वे जो कुछ भी अच्छा कर रहे हैं उसके लिए अपने संपादक बैकअप का उपयोग करें (आपातकाल के मामले में बदलावों का समर्थन) और इसके नियंत्रण के लिए संशोधन पर नियंत्रण रखें, जो आपके सॉफ़्टवेयर के महत्वपूर्ण संस्करणों (टीम के विकास को सुविधाजनक बनाने) के लिए अच्छा है। इस काम के लिए सही उपकरण का उपयोग करें।
TED

26
"बैकअप फाइलें बहुत अधिक उपरि और लगभग कोई मूल्य नहीं जोड़ती हैं": क्या यह निर्णयवाद नहीं है?
दयनीय चर

70

Emacs बैकअप / ऑटो-सेव फाइलें बहुत मददगार हो सकती हैं। लेकिन ये फीचर भ्रामक हैं।

बैकअप फ़ाइलें

बैकअप फ़ाइलों में अंत में टिल्ड ( ~या ~9~) होते हैं और उपयोगकर्ता होम डायरेक्टरी को लिखे जाएंगे। जब make-backup-filesगैर-शून्य एमएसीएस स्वचालित रूप से मूल फ़ाइल का बैकअप बनाता है तो पहली बार फ़ाइल को बफर से बचाया जाता है। यदि आप एक नई फ़ाइल का संपादन कर रहे हैं, तो Emacs दूसरी बार फ़ाइल सहेजते समय एक बैकअप बनाएगा।

कोई फर्क नहीं पड़ता कि आप कितनी बार फ़ाइल को सहेजते हैं बैकअप अपरिवर्तित रहता है। यदि आप बफ़र को मारते हैं और फिर फ़ाइल पर दोबारा जाते हैं, या अगली बार जब आप एक नया Emacs सत्र शुरू करते हैं, तो एक नई बैकअप फ़ाइल बनाई जाएगी। नया बैकअप फ़ाइल की सामग्री को फिर से खोलने, या संपादन सत्रों की शुरुआत में दर्शाता है। लेकिन एक मौजूदा बैकअप को फिर कभी नहीं छुआ जाता है। इसलिए मुझे इसे बनाए गए बैकअप के लिए उपयोगी लगता है (नीचे कॉन्फ़िगरेशन देखें)।

उपसर्ग तर्कों के साथ बैकअप का स्पष्ट रूप से उपयोग save-buffer( C-x C-s) करने के लिए ।

diff-backupऔर dired-diff-backupइसके बैकअप या इसके विपरीत के साथ एक फ़ाइल की तुलना करता है। लेकिन बैकअप फ़ाइलों को पुनर्स्थापित करने के लिए कोई फ़ंक्शन नहीं है। उदाहरण के लिए, विंडोज के तहत, एक बैकअप फ़ाइल को पुनर्स्थापित करने के लिए

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

इसे मैन्युअल रूप से कॉपी करना होगा

C:\Users\USERNAME\.emacs.el

ऑटो-सेव फाइल्स

ऑटो-सेव फाइल्स हैशमार्क ( #) का उपयोग करती हैं और स्थानीय रूप से प्रोजेक्ट डायरेक्टरी (वास्तविक फाइलों के साथ) के भीतर लिखी जानी चाहिए। कारण यह है कि ऑटो-सेव फाइलें केवल अस्थायी फाइलें होती हैं जो Emacs तब तक बनाती हैं जब तक कि एक फाइल फिर से नहीं बचती है (जैसे कि आज्ञाकारिता जल्दी करना)।

  • फ़ाइल को सहेजने से पहले उपयोगकर्ता दबाता है C-x C-s( save-buffer) Emacs ऑटो-सेव फाइलें - गिनती कीस्ट्रोक्स ( auto-save-interval) पर आधारित होता है या जब आप टाइप करना बंद कर देते हैं ( auto-save-timeout)।
  • जब भी यह क्रैश होता है, तो Emacs ऑटो-सेव करता है, जिसमें Emacs जॉब को शेल कमांड से मारना भी शामिल है।

जब उपयोगकर्ता फ़ाइल को सहेजता है, तो ऑटो-सहेजा गया संस्करण हटा दिया जाता है। लेकिन जब उपयोगकर्ता फ़ाइल को सहेजे बिना बाहर निकालता है, तो Emacs या X सत्र क्रैश हो जाता है, स्वत: सहेजी गई फ़ाइलें अभी भी मौजूद हैं।

ऑटो-सेव फ़ाइलों का उपयोग revert-bufferया recover-fileपुनर्स्थापित करने के लिए। ध्यान दें कि Emacs ने ~ / .emacs.d / auto-save-list नामक फाइलों में बाद की वसूली के लिए सत्रों को बाधित किया । 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 फ़ाइलों के लिए इसे सक्षम करने के लिए , अपने .emacs में कुछ का उपयोग करें:

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

वैकल्पिक रूप से, केवल कुछ फ़ाइलों की सुरक्षा के लिए, कुछ .txt फ़ाइलों की तरह , एक लाइन का उपयोग करें

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

फ़ाइल में।


तो आप ऑटोसैव का उपयोग नहीं करते हैं? ये सेटिंग्स आपको अपने फ़ोल्डर में उन गंदा # फ़ाइलनाम # शीर्ष # फ़ाइलों को देखने से बचने की अनुमति देती हैं?
पास्कलवूटेन

3
मैं हमेशा संवेदनशील डेटा वाली फ़ाइलों को छोड़कर डिफ़ॉल्ट रूप से ऑटोसवे और बैकअप फ़ाइलों का उपयोग करता हूं। संवेदनशील मोड ऑटोसैविंग और बैकअप को अक्षम करता है। BTW, # file.ext # फाइलें वास्तव में बुरा नहीं हैं, क्योंकि Emacs जरूरत के अनुसार इन्हें बनाता और हटाता है। यदि वे बने रहते हैं या तो Emacs अभी भी चल रहे हैं, या वे एक दुर्घटनाग्रस्त Emacs से एक कलाकृति हैं। दोनों मामलों में वे दिन बचा सकते हैं ;-)
एंड्रियास स्पिंडलर

आह, उस अतिरिक्त जानकारी के लिए धन्यवाद। मुझे वास्तव में उनके साथ ज्यादातर सकारात्मक अनुभव है (उन्होंने मेरा दिन बचाया)। केवल जब आप कुरूपता की तलाश कर रहे हैं, तो ठीक है आप इसे वहीं मिला :)
पास्कलवूटेन

BTW यह बैकअप बनाने के लिए एक चीज है, और बैकअप को पुनर्स्थापित करने के लिए एक अलग चीज है। इसलिए ऑटो-सेव के साथ खेलें। Emacs नौकरी या ssh सत्र को मार डालो। अगर कोई ऑटो-सेव फाइल diffहै, तो वास्तविक फाइल के साथ। फिर Emacs फायर करें और अपने आप पता करें कि क्या revert-bufferकरता है। यह आपातकाल के मामलों में जल्दी से भुगतान करेगा।
एंड्रियास स्पिंडलर

संवेदनशील-मोड महान काम करता है। धन्यवाद। कृपया ध्यान दें कि अपनी पोस्ट में आप इसे संवेदनशील-मामूली-मोड कहते हैं जबकि परिभाषा (लिंक) में इसे संवेदनशील-मोड कहा जाता है। शायद आप इसे संरेखित करना चाहते हैं।
हेमैन

65

स्वीकार किए जाते हैं जवाब अच्छा है, लेकिन यह बहुत अतिरिक्त द्वारा सुधार किया जा सकता पर बैकअप लेने के हर बचाने और बैक अप लेना संस्करणीकृत फ़ाइलें

पहले, मूल सेटिंग्स, जैसा कि स्वीकृत उत्तर में वर्णित है :

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

इसके बाद, बैकअप संस्करण वाली फाइलें भी, जिन्हें एमएसीएस डिफ़ॉल्ट रूप से नहीं करता है (आप हर सेव, राइट?) पर नहीं करते हैं:?

(setq vc-make-backup-files t)

अंत में, केवल पहले ही नहीं, प्रत्येक बचत पर एक बैकअप बनाएं। हम दो प्रकार के बैकअप बनाते हैं:

  1. प्रति-सत्र बैकअप: प्रत्येक Emacs सत्र में बफर के पहले सहेजें पर एक बार । ये Emac के डिफ़ॉल्ट बैकअप व्यवहार का अनुकरण करते हैं।

  2. प्रति-बचत बैकअप: प्रत्येक सेव पर एक बार । Emacs डिफ़ॉल्ट रूप से ऐसा नहीं करते हैं, लेकिन यदि आप Emacs को लंबे समय तक चलाना छोड़ दें तो यह बहुत उपयोगी है।

बैकअप विभिन्न स्थानों में जाना और Emacs बैकअप dirs स्वचालित रूप से बनाता है अगर वे मौजूद नहीं हैं:

;; 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, अपने पिछले के बाद तीन घंटे के बारे में प्रतिबद्ध: पी

ऊपर एक Emacs विकी पेज पर आधारित है जिसे मैंने बहुत अधिक संपादित किया है


मैंने अपनी init.el फ़ाइल के अंदर उपरोक्त कोड चिपकाया है, फिर भी मुझे कोई बैकअप निर्देशिका नहीं मिली है और emacs अभी भी सभी बैकअप फ़ाइलों को बनाता है। मुझे कुछ गलत समझ में आ सकता है, मैं emacs के लिए नया हूँ: P
Soeholm

@Soeholm: आप पेस्ट था सब सहित मेरा उत्तर में कोड की, setqमेरा उत्तर के शीर्ष पर रों? उपरोक्त मेरे लिए Emacs 24.5.1 में काम करता है।
ntc2

इसने अब काम करना शुरू कर दिया। मेरे पास सभी कोड चिपकाए गए थे, इसलिए मुझे यकीन नहीं है कि मेरे नए कॉन्फ़िगरेशन को स्वीकार करना धीमा था। लेकिन बहुत बहुत धन्यवाद!
Soeholm

1
एक फॉलोअप के रूप में, मुझे पता है कि अब यह काम क्यों नहीं किया। इसने एक मशीन पर काम किया, लेकिन दूसरे ने नहीं। ऐसा इसलिए था क्योंकि मेरे घर की निर्देशिका में एक खाली .emacs फ़ाइल थी, जिसने मेरी .emacs.d निर्देशिका को प्राथमिकता दी। मूर्खतापूर्ण गलती ..
Soeholm

31

बैकअप विकल्पों को कॉन्फ़िगर करने का एक अन्य तरीका कस्टमाइज़ इंटरफ़ेस है। दर्ज:

M-x customize-group

और फिर Customize group:प्रॉम्प्ट दर्ज करें backup

यदि आप बफ़र के नीचे स्क्रॉल करते हैं तो आपको बैकअप डायरेक्टरी एलिस्ट दिखाई देगा । दिखाएँ मूल्य पर क्लिक करें और सूची की पहली प्रविष्टि निम्नानुसार सेट करें:

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

वैकल्पिक रूप से, आप मेरी सेटिंग मेक बैकअप फाइल टू को बंद कर सकते हैं off

यदि आप नहीं चाहते कि Emacs आपकी .emacsफ़ाइल को स्वचालित रूप से संपादित करें तो आप एक कस्टमाइज़ेशन फ़ाइल सेट करना चाहेंगे ।


4
काश कि मुझे customize-group2 साल पहले पता होता। धन्यवाद!
wrl

30

आप उन्हें पूरी तरह से निष्क्रिय कर सकते हैं

(setq make-backup-files nil)

मैं इसे शेल प्रॉम्प्ट से सेट करना पसंद करता हूं, जब मैं होस्ट से होस्ट करने के लिए हॉपर कर रहा हूं मुझे पसंद नहीं है। थेक्स फाइलें: एमएसीएस - येवल "(सेट मेक-बैकअप-फाइल एनआईएल)"
डेव मोर्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.