পুরানো বাফারগুলি স্বয়ংক্রিয়ভাবে বন্ধ করবেন?


9

প্রতিটি ফাইলের সামান্য পরিবর্তনের জন্য আমার সম্প্রতি প্রচুর ফাইল সম্পাদনা করতে হবে। প্রতিটি ফাইল পেতে, আমি NERDtree মাধ্যমে ব্রাউজ এবং একের পর এক ফাইল খুললাম। আরও বেশি ফাইল খুলতে গিয়ে আমি লক্ষ্য করেছি যে আমার স্মৃতি ব্যবহারের পরিমাণ অনেক বেড়েছে। ক্লোজিং ভিম আমাকে অনেক স্মৃতি ফিরে পেয়েছে।

আমি বেশ কয়েকটি প্লাগইন ইনস্টল করেছি, তবে আমি ভাবছি যে আমার মেমরির ব্যবহার এত মারাত্মকভাবে বেড়ে যাওয়ার কারণটি ছিল কয়েকটি সম্পাদনার পরে আমি যে পরিমাণ বাফার খোলা হয়েছিল।

ভিফ একবারে খোলার অনুমতি দেয় এমন সম্পাদনকারীদের সংখ্যার সীমাবদ্ধ করার কি কোনও উপায় আছে, সম্পাদনার সময়টির সাথে পুরানো বাফারগুলি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায়?

উত্তর:


5

আসুন সমস্যাটি সমাধান করুন, লক্ষণগুলি না দিয়ে চিকিত্সা করুন। ভিমে সাধারণত প্রচুর পরিমাণে স্মৃতি ব্যবহার করা উচিত নয়। ইস্যুটি সেরাভাবে বিচ্ছিন্ন করা হবে। অপরাধীকে খুঁজে পেতে সহায়তা করার জন্য কিছু টিপস:

  • প্লাগইনগুলি অক্ষম করুন (এটি দ্রুত করার জন্য বাইনারি অনুসন্ধান ব্যবহার করুন)
  • ~/.vimrcকিছু আছে কিনা তা দেখতে নীচে হ্রাস করুন
  • এর ~/.vimrcমাধ্যমে আপনার সম্পূর্ণ অক্ষম করুনvim -u NONE

এছাড়াও আমি কীভাবে আমার ভিএমআরসি ফাইলটি ডিবাগ করব?

আপনি যদি একটি প্লাগইন সহ একটি মেমরি বাগ খুঁজে পান তবে প্লাগইন বিকাশকারীর সাথে যোগাযোগ করুন। যদি আপনি ভিমের সাথে একটি স্মৃতি বাগ খুঁজে পান তবে ত্রুটিটি পুনরুত্পাদন করার পদক্ষেপ সহ একটি বাগ রিপোর্ট জমা দিন। দেখা:h bugs


+1 টি; একইসাথে ভিমে একটি গাজিলিয়ন বাফার খোলা সম্ভব এবং এখনও ভাল হওয়া উচিত। যতক্ষণ আপনি বাফারটি দেখছেন না (উইন্ডোতে বা "ট্যাব") এটি মেমরিতে লোড হয় না।
মার্টিন টর্নয়েজ

@ কার্পেটসমোকার, বাফার ভেরিয়েবল এবং সেটিংস অদৃশ্য হয় না যখন কোনও উইন্ডোতে বাফার প্রদর্শিত না হয়। যদি পিটারের পরামর্শ অনুসারে একটি প্লাগইন প্রতিটি বাফারের জন্য প্রচুর তথ্য সঞ্চয় করে, তবে মেমরিটি নষ্ট হতে পারে (শেষ-ব্যবহারকারী বিবেচনা করে বাফার দিয়ে আরও কিছু করবে না)। বিটিডাব্লু: একটি প্লাগইন বাফার সম্পর্কিত ডেটা সংরক্ষণ করতে পারে না 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, ' ')
যথেষ্টের

@ লুচর্মিট সত্য, তবে এটি কোনও প্রয়োজনের প্রশ্ন নয় । আমি ভিমস্ক্রিপ্টের সাথে যথেষ্ট পরিচিত নই। আইআইআরসি'র bwসহায়তা বলছে যে আপনি "আপনি কী করছেন তা না জানলে" আপনার এটি ব্যবহার করা উচিত নয়। আমি না। :)
মুড়ু

পুরানো অভ্যাস। আমি সবসময় ব্যবহার করি :bw, এবং কখনই না :bd। আমি বাফার থেকে প্রায় সবকিছু মুছে ফেলার বিন্দুটি কখনও দেখিনি, তবে আসলে সমস্ত কিছুই not
লুক হার্মিটে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.