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




(4)

Emacs बैकअप / ऑटो-सेव फाइलें बहुत उपयोगी हो सकती हैं। लेकिन ये विशेषताएं उलझन में हैं।

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

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

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

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

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

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

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

C:\Users\USERNAME\.emacs.el

फ़ाइलों को स्वतः सेव करें

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

  • उपयोगकर्ता फ़ाइल को सहेजने के लिए Cx Cs ( 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 समारोह इस जानकारी का उपयोग करेगा।

एक स्वत: सहेजे गए दायर से पुनर्प्राप्त करने के लिए पसंदीदा तरीका Mx 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-*-

फाइल में

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


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

(setq make-backup-files nil)

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

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

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

(setq backup-by-copying t)

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

चूंकि आपके बैकअप अब अपने ही स्थान पर हैं, इसलिए आप उनमें से कम से कम, उनमें से अधिक चाहते हैं। इन चर के लिए Emacs प्रलेखन पर एक नज़र डालें ( Ch v साथ)।

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

अंत में, अगर आपके पास बिल्कुल बैकअप फाइल नहीं होनी चाहिए:

(setq make-backup-files nil)

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


स्वीकार्य उत्तर अच्छा है, लेकिन इसके अलावा प्रत्येक सहेजने और संस्करण वाली फ़ाइलों का बैक अप लेने के साथ-साथ इसे बहुत बढ़ाया जा सकता है

सबसे पहले, स्वीकार किए गए उत्तर में वर्णित मूलभूत सेटिंग्स:

(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 सत्र में बफर की पहली सहेजने पर। ये इमाक के डिफ़ॉल्ट बैकअप व्यवहार का अनुकरण करते हैं।

  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 में [email protected] बजाय [email protected] बजाय मैंने अपनी पिछली प्रतिबद्धता के लगभग तीन घंटे बाद, इस विषय में बहुत रुचि Makefile : पी

उपरोक्त एक इमाक्स विकी पेज पर आधारित है जिसे मैंने अत्यधिक संपादित किया है





emacs