2010-03-01 8 views
9

काम कर रहे बफर-ऑफ़र-सेव को नहीं मिल सकता है, मैं चाहता हूं कि Emacs मुझसे पूछें कि क्या मैं एक संशोधित बफर को सहेजना चाहता हूं, जब वह बफर फ़ाइल से संबद्ध नहीं है। एक नया बफर खोलने के लिए (एक फ़ाइल का दौरा नहीं) मैं अपने .emacs फ़ाइल में निम्न कार्य हो:Emacs -

;; Creates a new empty buffer 
(defun new-empty-buffer() 
    "Opens a new empty buffer." 
    (interactive) 
    (let ((buf (generate-new-buffer "untitled"))) 
    (switch-to-buffer buf) 
    (funcall (and default-major-mode)) 
    (setq buffer-offer-save t))) 

मैं "बफ़र-प्रस्ताव-बचाने" कुछ करने के लिए नहीं के बराबर नहीं की स्थापना चाल बनाया जाएगा सोचा। लेकिन जब भी मैं "हत्या-इस-बफर" के साथ बफर को मारता हूं, तो उसे तुरंत पूछे बिना मार दिया जाता है।

यह जीएनयू Emacs 23.1.1

कोई भी विचार पर क्या होता है?

धन्यवाद, डब्ल्यू

+0

समस्या को हल करने वाले 'नए-खाली-बफर' में बफर को फ़ाइल में जोड़ देगा? – Cheeso

उत्तर

2

buffers-offer-save के उपयोग को जोड़ने के लिए संपादित। नोट: परिवर्तनीय buffer-offer-save is only used upon exiting Emacs

आप इस कोड के साथ शुरू करते हैं और आप क्या चाहते हैं के लिए अनुकूलित कर सकते हैं:

(add-to-list 'kill-buffer-query-functions 'ask-me-first) 
(defun ask-me-first() 
    "prompt when killing a buffer" 
    (if (or buffer-offer-save 
      (eq this-command 'kill-this-buffer) 
      (and (buffer-modified-p) (not (buffer-file-name)))) 
     (y-or-n-p (format "Do you want to kill %s without saving? " (buffer-name))) 
    t)) 

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

आप इस सलाह है जो केवल संकेत देता है जब आप सहभागी एक बफर को मारने के लिए कोशिश कर रहे हैं का उपयोग कर सकते हैं:

(defadvice kill-buffer (around kill-buffer-ask-first activate) 
    "if called interactively, prompt before killing" 
    (if (and (or buffer-offer-save (interactive-p)) 
      (buffer-modified-p) 
      (not (buffer-file-name))) 
     (let ((answ (completing-read 
        (format "Buffer '%s' modified and not associated with a file, what do you want to do? (k)ill (s)ave (a)bort? " (buffer-name)) 
        '("k" "s" "a") 
        nil 
        t))) 
     (when (cond ((string-match answ "k") 
        ;; kill 
        t) 
        ((string-match answ "s") 
        ;; write then kill 
        (call-interactively 'write-file) 
        t) 
        (nil)) 
      ad-do-it) 

     t) 
    ;; not prompting, just do it 
    ad-do-it)) 
+0

बफर को फ़ाइल में जोड़कर, 'नया-खाली-बफर' समस्या को हल करेगा? – Cheeso

+0

@ चेसियो वैसे, 'नया-खाली-बफर' में ऐसा करने से अनुरोध गलत गलती पर होगा, जैसा कि वह एक नया बफर बनाता है। उस ने कहा, वह एक ध्वज सेट करने के लिए 'नया-खाली-बफर' संशोधित कर सकता है जिसे सलाह/कार्य बंद कर सकता है। मुझे लगता है कि मुझे 'नया-खाली-बफर' का उपयोग करने के लिए एक समाधान w/आउट पसंद आया। –

+0

गॉचा, धन्यवाद। – Cheeso

1

'new-empty-buffer संशोधित करना यह काम के रूप में मैं ट्रे के defadvice साथ इरादा बनाने के लिए लगता है।

 
;; Creates a new empty buffer 
(defun new-empty-buffer() 
"Opens a new empty buffer." 
(interactive) 
(let ((buf (generate-new-buffer "untitled"))) 
    (switch-to-buffer buf) 
    (funcall (and default-major-mode)) 
    (put 'buffer-offer-save 'permanent-local t) 
    (setq buffer-offer-save t))) 

यह बनाता है buffer-offer-save हमारे नए बफर में स्थायी स्थानीय, तो यह स्थानीय चर के बाकी के साथ मार डाला नहीं किया जाएगा प्रमुख मोड्स को स्विच।

1

buffer-offer-save Emacs से बाहर निकलने पर पूछने पर, बफर को बंद करने पर नहीं, मैन्युअल रूप से समझ में नहीं आता है, तो इसकी जिम्मेदारियों को "बड़ा" क्यों न करें?

(defadvice kill-buffer (around kill-buffer-ask activate) 
    "If `buffer-offer-save' is non-nil and a buffer is modified, 
prompt before closing." 
    (if (and buffer-offer-save (buffer-modified-p)) 
     (when (yes-or-no-p "The document isn't saved. Quit? ") 
     ad-do-it) 
    ad-do-it)) 

untitled बफर नव निर्मित होने पर यह संकेत नहीं देगा। यदि आप Elisp से kill-buffer का उपयोग करते हैं तो यह संकेत नहीं देगा। यह Emacs सिस्टम बफर जैसे *Messages* पर संकेत नहीं देगा। लेकिन अगर आप एक खाली बफर बनाया और इसमें कुछ लिखा तो यह संकेत देगा।

my answer on creating an empty buffer भी देखें।