स्वचालित रूप से सबसे पुराने बफ़र्स को बंद करें?


9

मुझे हाल ही में प्रत्येक फ़ाइल में एक छोटे से बदलाव के लिए बहुत सारी फ़ाइलों को संपादित करने की आवश्यकता थी। प्रत्येक फ़ाइल के लिए, मैंने NERDtree के माध्यम से ब्राउज़ किया और एक के बाद एक फ़ाइल खोली। जैसा कि मैंने अधिक से अधिक फाइलें खोलीं, मैंने देखा कि मेरे मेमोरी उपयोग में बहुत वृद्धि हुई है। क्लोजिंग विम ने मुझे बहुत मेमोरी वापस दी।

मेरे पास काफी कुछ प्लगइन्स स्थापित हैं, लेकिन मैं सोच रहा हूं कि जिस कारण मेरी मेमोरी का उपयोग बहुत अधिक बढ़ गया था वह कुछ एडिट के बाद मेरे द्वारा खोले गए बफ़र्स की संख्या के कारण था।

क्या बफ़र्स की संख्या को सीमित करने का एक तरीका है जो विम को एक समय में खोलने की अनुमति देता है, स्वचालित रूप से पुराने बफ़र्स को संपादन समय के संबंध में बंद कर देता है?

जवाबों:


5

आइए समस्या का समाधान करें, लक्षणों का इलाज न करें। विम को आम तौर पर बड़ी मात्रा में मेमोरी का उपयोग नहीं करना चाहिए। इस मुद्दे को सबसे अलग किया जाएगा। अपराधी को खोजने में मदद करने के लिए कुछ सुझाव:

  • प्लगइन्स अक्षम करें (इसे तेज़ बनाने के लिए बाइनरी खोज का उपयोग करें)
  • ~/.vimrcयह देखने के लिए कि क्या कुछ समस्या है, अपने को कम करें
  • के ~/.vimrcमाध्यम से पूरी तरह से अक्षम करेंvim -u NONE

यह भी देखें कि मैं अपनी vimrc फ़ाइल कैसे डिबग करूं?

यदि आपको एक प्लगइन के साथ एक मेमोरी बग मिलता है तो प्लगइन डेवलपर से संपर्क करें। यदि आपको विम के साथ एक मेमोरी बग मिलता है, तो त्रुटि को पुन: उत्पन्न करने के लिए एक बग रिपोर्ट सबमिट करें। देख:h bugs


+1; यह एक ही समय में विम में एक गज़िलियन बफ़र्स खोलना संभव है और अभी भी अच्छा होना चाहिए। जब तक आप बफर नहीं देख रहे हैं (एक विंडो में, या "टैब") यह मेमोरी में लोड नहीं होता है।
मार्टिन टूरनोइज

@Carpetsmoker, बफर चर और सेटिंग्स गायब नहीं होते हैं जब बफर एक विंडो में प्रदर्शित नहीं होता है। यदि कोई प्लगइन प्रत्येक बफ़र के लिए बहुत सारी जानकारी संग्रहीत करता है, जैसा कि पीटर ने सुझाव दिया है, तो मेमोरी बर्बाद हो सकती है (अंत-उपयोगकर्ता को देखते हुए बफ़र के साथ और कुछ भी नहीं किया जाएगा)। BTW: एक प्लगइन बफ़र्स से संबंधित डेटा को स्टोर नहीं कर सकता है, b:variablesलेकिन s:plugin[bufid]यदि एक प्लगइन मेंटेनर सार्वजनिक b: "नेमस्पेस" को प्रदूषित नहीं करना चाहता है । इस स्थिति में, बफ़र को हटाना आवश्यक रूप से सभी संबंधित चर / मेमोरी एकत्र नहीं करेगा।
ल्यूक हरमिट

5

निम्नलिखित को आपके प्रश्न का उत्तर देना चाहिए।

function! s:SortTimeStamps(lhs, rhs)
  return a:lhs[1] > a:rhs[1] ? 1 
     \   a:lhs[1] < a:rhs[1] ? -1
     \                       : 0
endfunction

function! s:Close(nb_to_keep)
  let saved_buffers = filter(range(0, bufnr('$')), 'buflisted(v:val) && ! getbufvar(v:val, "&modified")')
  let times = map(copy(saved_buffers), '[(v:val), getftime(bufname(v:val))]')
  call filter(times, 'v:val[1] > 0')
  call sort(times, function('s:SortTimeStamps'))
  let nb_to_keep = min([a:nb_to_keep, len(times)])
  let buffers_to_strip = map(copy(times[0:(nb_to_keep-1)]), 'v:val[0]')
  exe 'bw '.join(buffers_to_strip, ' ') 
endfunction

" Two ways to use it
" - manually
command! -nargs=1 CloseOldBuffers call s:Close(<args>)
" - or automatically
augroup CloseOldBuffers
  au!
  au BufNew * call s:Close(g:nb_buffers_to_keep)
augroup END
" and don't forget to set the option in your .vimrc
let g:nb_buffers_to_keep = 42

यह एक प्लगइन में गिरा दिया जाना है। फिर, आपको यह चुनना होगा कि इसका उपयोग कैसे करना है।


3

मुझे यकीन नहीं है कि संपादन के समय के साथ सबसे पुराने बफ़र्स कैसे प्राप्त किए जाएं, लेकिन कोई भी सबसे पुराने अशिक्षित बफ़र्स को बंद करने का प्रयास कर सकता है। कुछ इस तरह:

function CloseLast ()
    python <<EOF
import vim
N = 10
listed_buffers = [b for b in vim.buffers if b.options['buflisted'] and not b.options['modified']]
for i in range (0, len (listed_buffers) - N):
    vim.command (':bd' + str (listed_buffers[i].number))
EOF
endfunction

autocmd BufNew * call CloseLast()

टिप्पणियाँ:

  • vim.buffersवर्तमान सत्र में खोले गए प्रत्येक बफ़र की सूची है, इसलिए इसमें अनलिस्टेड बफ़र्स भी शामिल हैं। यह वैसा नहीं है जैसा कि सूची ने वापस लौटाया :ls
  • इसलिए, हमें छिपे या हटाए गए बफ़र्स को फ़िल्टर करना होगा। इसका उपयोग करके जाँच की जा सकती है options['buflisted']
  • इसी तरह, options['modified']यदि बफर संशोधित किया गया है, तो हमें जांचने देता है।
  • N अनमॉडिफाइड, सूचीबद्ध बफ़र्स की संख्या है जिसे आप खोलना चाहते हैं।

ल्यूक हरमिट के उत्तर के लिए धन्यवाद , जिससे मैंने सीखा कि टाइमस्टैम्प कैसे प्राप्त करें, आप इसके बजाय निम्नलिखित का उपयोग कर सकते हैं, सबसे पुराना निष्क्रिय किक आउट करने के लिए:

listed_buffers = (b for b in vim.buffers if b.options['buflisted'] and not b.options['modified'])
oldest_buffers = sorted (listed_buffers, key = lambda b: eval('getftime("' + b.name + '")'))
for i in range (0, len (oldest_buffers) - N):
    vim.command (':bd' + str (oldest_buffers[i].number))

1
आपको अजगर की जरूरत नहीं है। विम पर्याप्त से अधिक है: :let buffers = filter(range(0, bufnr('$')), 'buflisted(v:val) && ! getbufvar(v:val, "&modified")')+:exe 'bw '.join(buffers, ' ')
ल्यूक हरमिट

@LucHermitte सच है, लेकिन यह जरूरत का सवाल नहीं है । मैं सिर्फ विम्सस्क्रिप्ट से परिचित नहीं हूं। IIRC bwकी सहायता कहती है कि आपको इसका उपयोग नहीं करना चाहिए "जब तक कि आप यह नहीं जानते कि आप क्या कर रहे हैं"। मैं नही। :)
मूरू

पुरानी आदतें। मैं हमेशा उपयोग करता हूं :bw, और कभी नहीं :bd। मैंने कभी भी एक बफर से लगभग सब कुछ हटाने की बात नहीं देखी है, लेकिन वास्तव में सब कुछ नहीं।
ल्यूक हरमिट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.