En eski arabellekleri otomatik olarak kapat?


9

Son zamanlarda her dosyada küçük bir değişiklik yapmak için çok sayıda dosyayı düzenlemem gerekiyordu. Her dosyaya ulaşmak için NERDtree'ye göz attım ve bir dosyayı arka arkaya açtım. Giderek daha fazla dosya açarken, bellek kullanımımın çok büyüdüğünü fark ettim. Vimi kapatmak bana çok fazla bellek verdi.

Yüklü birkaç eklentim var, ancak bellek kullanımımın bu kadar büyük bir şekilde artmasının nedeninin, birkaç düzenlemeden sonra açtığım arabellek sayısından kaynaklandığını düşünüyorum.

Düzenleme süresine göre eski arabellekleri otomatik olarak kapatarak, vim'in bir kerede açılmasına izin verdiği tampon sayısını sınırlamanın bir yolu var mı?

Yanıtlar:


5

Sorunu çözelim, semptomları tedavi etmeyelim. Vim normalde büyük miktarda bellek kullanmamalıdır. Sorunu izole etmek en iyisi olacaktır. Suçluyu bulmanıza yardımcı olacak bazı ipuçları:

  • Eklentileri devre dışı bırak (daha hızlı hale getirmek için bir ikili arama kullanın)
  • İçinde ~/.vimrcherhangi bir sorun olup olmadığını görmek için aşağı inin
  • ~/.vimrcÜzerinden tamamen devre dışı bırakvim -u NONE

Ayrıca bkz. Vimrc dosyamda nasıl hata ayıklayabilirim?

Eklentiye sahip bir bellek hatası bulursanız eklenti geliştiricisine başvurun. Vim'de bir bellek hatası bulursanız, hatayı yeniden oluşturma adımlarını içeren bir hata raporu gönderin. Görmek:h bugs


+ 1; Vim'de aynı anda bir gazilyon tamponu açmak ve hala iyi olmak mümkün olmalıdır. Arabelleği görüntülemediğiniz sürece (bir pencerede veya "sekmede") belleğe yüklenmez.
Martin Tournoij

@Carpetsmoker, arabellek değişkenleri ve ayarlar, arabellek bir pencerede görüntülenmediğinde kaybolmaz. Bir eklenti Peter'ın önerdiği gibi her arabellek için çok fazla bilgi depolarsa, bellek boşalabilir (son kullanıcının arabellekle daha fazla bir şey yapmayacağını düşünerek). BTW: Bir eklenti, arabelleklerle ilgili verileri depolayamayabilir, b:variablesancak s:plugin[bufid]eklenti koruyucusu genel b: "ad alanını" kirletmemeyi tercih ederse . Bu durumda, arabelleğin silinmesi tüm ilgili değişkenleri / belleği toplamayacaktır.
Luc Hermitte

5

Aşağıdaki soruya cevap vermelidir.

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

Bu bir eklentiye bırakılmalıdır. Ardından, nasıl kullanılacağını seçmeniz gerekir.


3

Düzenleme süresi bakımından en eski arabellekleri nasıl alacağımdan emin değilim, ancak bunun yerine, en eski düzenlenmemiş arabellekleri kapatmayı deneyebilir. Gibi bir şey:

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()

Notlar:

  • vim.buffersgeçerli oturumda açılan her arabellek listesidir, dolayısıyla liste dışı arabellekleri de içerir. Döndürülen listeyle aynı değil :ls.
  • Bu nedenle, gizli veya silinmiş arabellekleri filtrelemeliyiz. Bu kullanılarak kontrol edilebilir options['buflisted'].
  • Benzer şekilde, options['modified']tamponun değiştirilip değiştirilmediğini kontrol edelim.
  • N açık olmasını istediğiniz değiştirilmemiş, listelenen arabelleklerin sayısıdır.

Sayesinde Luc Hermitte cevabı hangi ı damgalarını nasıl, önce çıkartılmamış en eski inaktif olsun, yerine aşağıdaki kullanabilirsiniz öğrendim:

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
Python'a ihtiyacınız yok. Vim fazlasıyla yeterli: :let buffers = filter(range(0, bufnr('$')), 'buflisted(v:val) && ! getbufvar(v:val, "&modified")')+:exe 'bw '.join(buffers, ' ')
Luc Hermitte

@LucHermitte Doğru, ama bu bir ihtiyaç meselesi değil . Vimscript'e yeterince aşina değilim. IIRC'nin bwyardımı "ne yaptığınızı bilmiyorsanız" kullanmamanız gerektiğini söylüyor. Yapmıyorum. :)
muru

Eski alışkanlıklar. Ben her zaman kullanırım :bwve asla :bd. Neredeyse her şeyi bir arabellekten silme noktasını hiç görmedim, ama aslında her şeyi değil.
Luc Hermitte
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.