У меня есть орда буферов, открытых в vim, и только некоторые из них открываются в разделенных окнах или на других вкладках. Есть ли способ закрыть все, кроме тех, которые в настоящее время видны в одном из этих разделов или вкладок?
Как закрыть все буферы, которые не отображаются в окне в vim?
Ответ 1
Здесь альтернативное решение, которое вы можете добавить в свой .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
Используйте :call Wipeout()
.
Ответ 2
Еще один пример. Используя пример, приведенный в справке Vim для tabpagebuflist()
, чтобы получить список буферов, которые появляются в закладке или окне. У меня есть ниже в моем .vimrc
function! DeleteInactiveBufs()
"From tabpagebuflist() help, get a list of all buffers in all tabs
let tablist = []
for i in range(tabpagenr('$'))
call extend(tablist, tabpagebuflist(i + 1))
endfor
"Below originally inspired by Hara Krishna Dara and Keith Roberts
"http://tech.groups.yahoo.com/group/vim/message/56425
let nWipeouts = 0
for i in range(1, bufnr('$'))
if bufexists(i) && !getbufvar(i,"&mod") && index(tablist, i) == -1
"bufno exists AND isn't modified AND isn't in the list of buffers open in windows and tabs
silent exec 'bwipeout' i
let nWipeouts = nWipeouts + 1
endif
endfor
echomsg nWipeouts . ' buffer(s) wiped out'
endfunction
command! Bdi :call DeleteInactiveBufs()
Ответ 3
Добавьте это в свой .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()
(Вероятно, вы захотите привязать к нему ключ или команду.)
Update:
Здесь обновлена версия для поддержки вкладок. (Я сам не использую вкладки, поэтому я не понял, что 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 loaded and not visible
for b in range(1, bufnr('$'))
if bufloaded(b) && !has_key(visible, b)
exe 'bd ' . b
endif
endfor
endfun
Ответ 4
Я знаю, почему второй script работает неправильно.
Это связано с функцией 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
Спасибо вам.
Ответ 5
Там плагин, который выполняет именно это и немного больше!
Отъезд close-buffers.vim