2011-02-07 14 views
7

मैं इमैक को अपने बफर के लिए रीवर्ट-बफर करने या ऑटो-रिवर्ट-मोड का उपयोग करने के बाद अपना पूर्ववत इतिहास कैसे बना सकता हूं?क्या फ़ाइल से बफर को वापस करने के बाद Emacs में पूर्ववत सूची को बनाए रखने का कोई तरीका है?

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

उत्तर

2

मैं स्पष्ट दृष्टिकोण लगता है कि एक समारोह जो वर्तमान बफर सामग्री को मारता होगा, और फिर फ़ाइल से वर्तमान सामग्री में पढ़ने के लिए insert-file पर कॉल करें।

यदि फ़ाइल में किए गए परिवर्तनों में वर्ण एन्कोडिंग में परिवर्तन शामिल हैं, तो समस्या हो सकती है? मैंने इसका परीक्षण नहीं किया है।

मेरा वर्तमान प्रयास यहां है। यह थोड़ा बालों वाला आईएमओ है, लेकिन यह ठीक काम करता है।

;; Allow buffer reverts to be undone 
(defun my-revert-buffer (&optional ignore-auto noconfirm preserve-modes) 
    "Revert buffer from file in an undo-able manner." 
    (interactive) 
    (when (buffer-file-name) 
    ;; Based upon `delphi-save-state': 
    ;; Ensure that any buffer modifications do not have any side 
    ;; effects beyond the actual content changes. 
    (let ((buffer-read-only nil) 
      (inhibit-read-only t) 
      (before-change-functions nil) 
      (after-change-functions nil)) 
     (unwind-protect 
      (progn 
      ;; Prevent triggering `ask-user-about-supersession-threat' 
      (set-visited-file-modtime) 
      ;; Kill buffer contents and insert from associated file. 
      (widen) 
      (kill-region (point-min) (point-max)) 
      (insert-file-contents (buffer-file-name)) 
      ;; Mark buffer as unmodified. 
      (set-buffer-modified-p nil)))))) 

(defadvice ask-user-about-supersession-threat 
    (around my-supersession-revert-buffer) 
    "Use my-revert-buffer in place of revert-buffer." 
    (let ((real-revert-buffer (symbol-function 'revert-buffer))) 
    (fset 'revert-buffer 'my-revert-buffer) 
    ;; Note that `ask-user-about-supersession-threat' calls 
    ;; (signal 'file-supersession ...), so we need to handle 
    ;; the error in order to restore revert-buffer. 
    (unwind-protect 
     ad-do-it 
     (fset 'revert-buffer real-revert-buffer)))) 

(ad-activate 'ask-user-about-supersession-threat) 

Annoyingly, मैं केवल अभी revert-buffer डॉक्स में सभी प्रासंगिक दिखने जानकारी देखा है, इसलिए वहाँ शायद एक ज्यादा सरल यह करने के लिए रास्ता नहीं है।

तो revert-buffer-function का मूल्य गैर नहीं के बराबर है, यह को कहा जाता है इस आदेश के लिए सब काम करते हैं। अन्यथा, हुक before-revert-hook और after-revert-hook शुरुआत और अंत में चल रहे हैं, और यदि revert-buffer-insert-file-contents-function गैर-शून्य है, तो इसे देखी गई फ़ाइल सामग्री को फिर से पढ़ने के बजाय कहा जाता है।

+0

मुझे लगता है कि यह एक बहुत अच्छा दृष्टिकोण है। मैं खुद को tweaking पर जाने के लिए जा रहा हूँ। धन्यवाद! – Sarah

+0

आपका स्वागत है। मैंने उस कोड के साथ कुछ समस्याओं के समाधान का पता लगाया है, और जवाब अपडेट किया है: अब यह अद्यतन बफर को अनमोडिफाइड के रूप में सेट करता है, और मैंने पाया कि '(सेट-विज़िट-फाइल-मोडटाइम)' इसे रोकने से रोकने का तरीका था मुसीबत। इसका अर्थ यह है कि यदि आप रिवर्ट को पूर्ववत करते हैं, तो यह अब आपको फिर से सवाल नहीं पूछता है यदि आप फ़ाइल को दोबारा संशोधित करने का प्रयास करते हैं, जो मूल कार्यक्षमता को ध्यान में रखते हुए निश्चित रूप से अधिक है। यदि आप एक बेहतर समाधान के साथ आते हैं, तो कृपया यहां एक नया उत्तर पोस्ट करें। – phils

3

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

(add-hook 'before-revert-hook (lambda() (kill-ring-save (point-min) (point-max)))) 
8

Emacs आपको व्यवहार को ओवरराइड करने के लिए रिवर्ट-बफर-फ़ंक्शन सेट करने की अनुमति देता है। यहां एक रिवर्ट-बफर कार्यान्वयन है जो इतिहास को रखता है।

;; emacs doesn't actually save undo history with revert-buffer 
;; see http://lists.gnu.org/archive/html/bug-gnu-emacs/2011-04/msg00151.html 
;; fix that. 
(defun revert-buffer-keep-history (&optional IGNORE-AUTO NOCONFIRM PRESERVE-MODES) 
    (interactive) 

    ;; tell Emacs the modtime is fine, so we can edit the buffer 
    (clear-visited-file-modtime) 

    ;; insert the current contents of the file on disk 
    (widen) 
    (delete-region (point-min) (point-max)) 
    (insert-file-contents (buffer-file-name)) 

    ;; mark the buffer as not modified 
    (not-modified) 
    (set-visited-file-modtime)) 

(setq revert-buffer-function 'revert-buffer-keep-history) 
+0

महान स्थान होगा यदि बिंदु स्थान भी संरक्षित किया गया था;) –

3

आगामी Emacs-24.4 डिफ़ॉल्ट रूप से आप जो चाहते हैं वह करता है।

संबंधित मुद्दे

 संबंधित मुद्दे