2009-09-12 19 views
8

मुझे लंगड़ा कहो, लेकिन मैं अपने अवचेतन C-x C-s तंत्रिका ट्विच से थक गया हूं। मैं अक्सर बफर को स्विच कर रहा हूं और मुझे लगता है कि जैसे ही मैं दूसरे पर स्विच करता हूं, मैं एक निश्चित बफर को सहेजना चाहता हूं। मेरे पास Emacs-Lisp मूल बातें सीखने का समय नहीं है।स्विच बफर पर Emacs ऑटो-सेव

यह कैसे करें, या बेहतर समाधान के बारे में कोई संकेत?

(एक संबंधित नोट पर, मैं एक autosave workaround कि मौजूदा बफर जैसे ही आप समय की एक निश्चित राशि के लिए निष्क्रिय हैं बचा सकते हैं पाया।)

उत्तर

16

पर Seth के answer का विस्तार करने के लिए, मैं यह कर चाहते हैं:

(defadvice switch-to-buffer (before save-buffer-now activate) 
    (when buffer-file-name (save-buffer))) 
(defadvice other-window (before other-window-now activate) 
    (when buffer-file-name (save-buffer))) 
(defadvice other-frame (before other-frame-now activate) 
    (when buffer-file-name (save-buffer))) 

buffer-file-name के लिए चेक बफ़र्स बचत टाल w/बाहर फ़ाइलें। आपको उन सभी प्रविष्टि बिंदुओं को समझने की आवश्यकता है जिन्हें आप उपयोग करने वाले बफर स्विच करने के लिए उपयोग करते हैं (मैं other-window भी सलाह दूंगा)।

+0

मेरे द्वारा +1 ... बफर फ़ाइल के बारे में भूल गया -नाम – seth

+1

बिल्कुल सही! धन्यवाद :) 6 साल बाद और अभी भी एक महान जवाब है –

6

मैं Emacs के लिए नए की तरह कर रहा हूँ अपने आप को तुतलाना लेकिन इस मेरे परीक्षण में काम करता है:

(defadvice switch-to-buffer (before save-buffer-now) 
    (save-buffer)) 

(ad-activate 'switch-to-buffer) 

हालांकि यह क्योंकि यह हर बफर के बाद कहा जाता है एक तरह से परेशान है (जैसे खरोंच)। तो, इस जवाब को एक संकेत पर विचार करें।

आप इसे अक्षम करना चाहते हैं, तो आप कॉल करने के लिए की आवश्यकता होगी:

(ad-disable-advice 'switch-to-buffer 'before 'save-buffer-now) 
(ad-activate 'switch-to-buffer) 
2

विचारों के एक जोड़े।

सबसे पहले, यदि आप अपने आप को पर्याप्त उच्च आवृत्ति के साथ सहेजने जैसे कमांड का आह्वान करते हैं, तो आप कमांड के लिए एक छोटी कुंजी बाध्यकारी मान सकते हैं। उदाहरण के लिए, मैंने खुद को "ट्विच" भी पाया, इसलिए अब मैं संपादन को बचाने के लिए C-x C-s के बजाय f2 का उपयोग करता हूं।

जो फ़ंक्शन मैं f2 से बांधता हूं, बिना किसी सहेजे गए बफर को बिना शर्त बचाता है। आपको यह उपयोगी लगेगा:

(defun force-save-all() 
    "Unconditionally saves all unsaved buffers." 
    (interactive) 
    (save-some-buffers t)) 

(global-set-key [f2] 'force-save-all) 

अब मुख्य मुद्दे पर। आप (ध्यान दें कि force-save-all कहा जाता है) कुछ इस तरह की कोशिश कर सकते:

(defun my-switch-to-buffer (buffer) 
    (interactive (list (read-buffer "Switch to buffer: " (cadr buffer-name-history) nil))) 
    (force-save-all) 
    (switch-to-buffer buffer)) 

(global-set-key "\C-xb" 'my-switch-to-buffer) 
बेशक

, आप भी स्विच बफर कार्यक्षमता दूसरी कुंजी पर एक समारोह चाबी की तरह, बाँध सकता है इतना है कि यह एक एक प्रेस ऑपरेशन है।

मैंने सोचा कि @seth सलाह का उपयोग करने के बारे में एक अच्छा विचार था, लेकिन मैंने देखा कि ELISP मैनुअल बताता है कि advice not be used for key bindings। मुझे पूरा यकीन नहीं है कि यह मामला क्यों है, लेकिन मैनुअल ने एफवाईआई को सुझाव दिया है।

+0

दिलचस्प। जब मैं मैनुअल पढ़ रहा था तब कीबाइंडिंग के बारे में उस हिस्से को नहीं देखा। धन्यवाद। – seth

+0

इस समाधान के साथ एकमात्र समस्या तब होती है जब आप उदा। 'ido-switch-buffer' का उपयोग शुरू करें, आपको अपने फ़ंक्शन में भी बदलावों को ट्रैक करना होगा। –

+0

यह सच है, मुझे लगता है कि आप स्विच-टू-बफर प्रतीक को इस नए फ़ंक्शन में मूल रूप से सहेज सकते हैं (मूल को किसी अन्य प्रतीक में सहेजना, जैसे मूल-सेव-टू-बफर) –

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