2011-01-09 28 views
30

जब मैं फोकस खो देता हूं तो मेरे संपादकों को ऑटोसविंग फाइलों में उपयोग किया जाता है। मैंने हाल ही में मैकवीम पर स्विच किया है, और मैं उस व्यवहार को फिर से नहीं बना सकता। मैं इस की कोशिश की:जब मैं फोकस खो देता हूं तो मैं विम ऑटोसेव फाइल कैसे बना सकता हूं?

autocmd BufLeave,FocusLost * wall 

लेकिन अगर एक बफर अज्ञात है जब खिड़की या MacVim फोकस खो देता है, मैं निम्नलिखित की तरह एक त्रुटि प्राप्त:

Error detected while processing BufLeave Auto commands for "*": 
E141: No file name for buffer 1 

मैं, संदेह में हूँ क्योंकि :wall के प्रलेखन कहते हैं:

Write all changed buffers. Buffers without a file 
name or which are readonly are not written. 

इसलिए मैं इसे अज्ञात बफर छोड़ने की अपेक्षा करता हूं। क्या ऐसा करने के लिए इससे अच्छा तरीका है?

संपादित:

मैं बहुत है कि बेहतर तरीका है कि मैं क्या BufLeave का उपयोग करके इरादा करने के लिए यकीन है कि - बफ़र्स बचत जब मैं उनके बीच स्विच, इसलिए मैं नहीं मिलता है "पिछले के बाद से नहीं लिखने बदलें "- 'autowriteall' सेट करना है। प्रश्न तब भी खड़ा है जब मैकवीम अन्य अनुप्रयोगों (FocusLost) पर ध्यान केंद्रित करता है।

+0

में रखते बस इस संबंध में वहाँ बाहर फेंक: फ़ाइलों पर्याप्त स्वैप नहीं कर रहे हैं? – skippr

+2

मैं अपने काम का बैक अप लेने की कोशिश नहीं कर रहा हूं; मुझे किसी भी उपकरण के लिए डिस्क पर होने की आवश्यकता है, जिस पर मैंने फोकस स्विच किया है, जैसे परीक्षण सूट। – Peeja

उत्तर

38

आपको उन परिस्थितियों में त्रुटियों की परवाह नहीं है क्योंकि आप उनके बारे में कुछ भी नहीं कर सकते हैं - खासकर जब फोकस खोना। तो बस उन्हें निगल:

autocmd BufLeave,FocusLost * silent! wall 

एक व्यापक नृत्य तुलना में बहुत सरल यह पता लगाने की जहां है ताकि इसे से बचने के लिए एक त्रुटि होगी।

+0

यह एक अच्छा है! –

+7

इसे एक * की आवश्यकता है, जैसे 'autocmd BufLeave, FocusLost * चुप! दीवार ', कम से कम मेरे लिए, यह करता है। – pvinis

+0

यहां विम नोब .. यह लाइन कहां जाती है? अंदर। vimrc? – thefonso

3

मुझे लगता है जब wall के लिये दस्तावेज कहते हैं कि वे = nofile buftype साथ बफ़र्स की चर्चा करते हुए किया जा सकता है "एक फ़ाइल नाम के बिना"। जो भी आप चाहते हैं उसे प्राप्त करने का एक तरीका यह होगा कि ऑटोकॉम्ड को एक साधारण फ़ंक्शन कॉल करना होगा। जैसे, कुछ अपरीक्षित कोड विचार दे रहे हैं:

autocmd BufLeave,FocusLost * bufdo! call WriteFile() 

function WriteFile() 
    if (&buftype=="") && (expand("%:r") > "") && (&readonly==0) 
     write 
    endif 
endfunction 

मैं बफ़र्स की इस स्वचालित सहेजने की तरह कुछ हो रही विम में autosave विकल्प सेट करना होगा की मानक तरीका लगता है।

+0

'bufdo' वर्तमान विंडो में बफर स्विच करेगा। आपको शायद 'एस एस: curbuf = bufnr ('% ') लिखना चाहिए कोशिश करो | निष्पादित करें 'bufdo! WriteFile() '| पर कॉल करें अंत में | निष्पादित करें "बफर" .s: curbuf | endtry'। इसमें अभी भी समस्याएं हैं: मदद के बाद इस कोड 'सूची' विकल्प के बाद कुछ कारणों से बफर रीसेट किया गया था और कर्सर केंद्र में स्थित हो गया था। 'प्रयास' से पहले 'wincmd v' जोड़ना और' endtry' के बाद 'wincmd q' बेहतर काम करता है। – ZyX

+0

सादा 'wincmd v | निष्पादित करें 'bufdo! WriteFile() '| पर कॉल करें wincmd q' शायद सबसे अच्छा विकल्प है। – ZyX

+0

@ZyX - सुधार के लिए धन्यवाद; जब मैं bufdo सुझाव दिया मैं सोच नहीं रहा था। आपके दूसरे समाधान की तरह लगता है ठीक काम करेगा, नई विंडो खोलने, बफर के माध्यम से साइकिल चलाना, फिर विंडो बंद करना।मुझे अभी भी लगता है कि 'ऑटोसेव' के साथ जाकर सबसे अच्छा समाधान है, या संभावित रूप से एक अधिक जटिल फ़ंक्शन लिखना जिसे autocmd द्वारा बुलाया जा सकता है जो 'tabdo' के भीतर 'windo' कमांड का उपयोग करता है ताकि खिड़की के भीतर बफर स्विचिंग की आवश्यकता न हो। –

0
autocmd BufLeave,FocusLost * bufdo! call WriteFile() 

function WriteFile() 
    if (&buftype=="") && (expand("%:r") > "") && (&readonly==0) 
     write 
    endif 
endfunction 

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

+0

यह हर्बर्ट सिट्ज के उत्तर की अलग-अलग टिप्पणी के साथ उत्तर की एक प्रति है। क्या इसका इरादा था उनके उत्तर पर एक टिप्पणी के रूप में? – Peeja

0

सिर्फ विम में स्वतः सहेजना को .vimrc

set updatetime=1000 
autocmd CursorHoldI * silent w 
+0

इसमें कई समस्याएं हैं: सबसे पहले, इसे सहेजने के लिए एक पूर्ण सेकेंड लगता है, जिसके द्वारा मैं डिस्क पर फ़ाइल पहले से ही रखना चाहता हूं; दूसरा, यह केवल तभी काम करता है जब आप सम्मिलित मोड में रहते हैं; तीसरा, 'लिखना' इसे काट नहीं देता है। @ एरिस्टोटल पागाल्टज़िस का जवाब मेरे लिए इसे कवर करता है। – Peeja

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