Вы могли использовать разность, чтобы видеть, ДЕЙСТВИТЕЛЬНО отличаются ли они.. Я предполагаю, что это удалит много бесполезного сравнения. Затем для алгоритма я использовал бы вероятностный подход.. что является возможностями, что они выглядят одинаково.. Я основывал это на сумме rgb в каждом пикселе. Вы могли также найти некоторые другие метрики, такие как яркость и наполнить как этот.
Вот альтернативное решение, которое вы можете добавить в свой .vimrc
:
function! Wipeout()
" list of *all* buffer numbers
let l:buffers = range(1, bufnr('$'))
" what tab page are we in?
let l:currentTab = tabpagenr()
try
" go through all tab pages
let l:tab = 0
while l:tab < tabpagenr('$')
let l:tab += 1
" go through all windows
let l:win = 0
while l:win < winnr('$')
let l:win += 1
" whatever buffer is in this window in this tab, remove it from
" l:buffers list
let l:thisbuf = winbufnr(l:win)
call remove(l:buffers, index(l:buffers, l:thisbuf))
endwhile
endwhile
" if there are any buffers left, delete them
if len(l:buffers)
execute 'bwipeout' join(l:buffers)
endif
finally
" go back to our original tab page
execute 'tabnext' l:currentTab
endtry
endfunction
Используйте : вызовите Wipeout ()
.
Добавьте это в свой .vimrc:
function! CloseHiddenBuffers()
let i = 0
let n = bufnr('$')
while i < n
let i = i + 1
if bufloaded(i) && bufwinnr(i) < 0
exe 'bd ' . i
endif
endwhile
endfun
Затем вы можете сделать это, чтобы закрыть скрытые буферы:
:call CloseHiddenBuffers()
(Вы, вероятно, захотите привязать к нему ключ или команду.)
Обновление:
Эта версия обновлена для поддержки закладок. (Я сам не использую вкладки, поэтому я не понял, что bufwinnr работает только для окон на текущей странице).
function! CloseHiddenBuffers()
" figure out which buffers are visible in any tab
let visible = {}
for t in range(1, tabpagenr('$'))
for b in tabpagebuflist(t)
let visible[b] = 1
endfor
endfor
" close any buffer that's loaded and not visible
for b in range(1, bufnr('$'))
if bufloaded(b) && !has_key(visible, b)
exe 'bd ' . b
endif
endfor
endfun
Я знаю, почему второй сценарий не работает.
Это связано с функцией bufloaded (), которая должна быть bufexits ()!
Действительно, буфер для удаления не загружен! Просто удалите это условие, но это дает некоторое предупреждение, когда мы пытаемся стереть неиспользуемый буфер, поэтому мы должны использовать bufexists (b).
Окончательное решение следующее:
function! CloseHiddenBuffers()
" Tableau pour memoriser la visibilite des buffers
let visible = {}
" Pour chaque onglet...
for t in range(1, tabpagenr('$'))
" Et pour chacune de ses fenetres...
for b in tabpagebuflist(t)
" On indique que le buffer est visible.
let visible[b] = 1
endfor
endfor
" Pour chaque numero de buffer possible...
for b in range(1, bufnr('$'))
" Si b est un numero de buffer valide et qu'il n'est pas visible, on le
" supprime.
if bufexists(b) && !has_key(visible, b)
" On ferme donc tous les buffers qui ne valent pas 1 dans le tableau et qui
" sont pourtant charges en memoire.
execute 'bwipeout' b
endif
endfor
endfun
Спасибо вам.