modo - ¿Cómo cierro todos los buffers que no se muestran en una ventana en vim?
vim guardar (5)
¡Hay un complemento que hace exactamente esto y un poco más!
Echa un vistazo a close-buffers.vim
Tengo una horda de almacenamientos intermedios abiertos en vim, con solo algunos de ellos abiertos en ventanas divididas o en otras pestañas. ¿Hay alguna manera de cerrar todas las que están visibles actualmente en una de esas divisiones o pestañas?
Agregue esto a su .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
Luego puede hacer esto para cerrar los búferes ocultos:
:call CloseHiddenBuffers()
(Probablemente quiera vincular una tecla o un comando a ella).
Actualizar:
Aquí hay una versión actualizada para admitir páginas con pestañas. (No utilizo páginas con pestañas, así que no me había dado cuenta de que bufwinnr solo funciona para Windows en la página actual).
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
Sé por qué el segundo script no funciona correctamente.
Esto se debe a la función bufloaded () que debe ser bufexits ()!
De hecho, ¡no se carga un búfer para eliminar! Solo eliminar esta condición está bien, pero advierte cuando estamos tratando de eliminar un buffer no utilizado, así que tenemos que usar bufexists (b).
La solución final es la siguiente:
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
Gracias a ti.
Sin embargo, otra toma de esto. Usando el ejemplo dado en la ayuda de Vim para tabpagebuflist()
para obtener una lista de los buffers que aparecen en una pestaña o ventana. Tengo el siguiente en mi .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()
Aquí hay una solución alternativa que puede .vimrc
en su .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
Uso :call Wipeout()
.