Modo efficiente per ripulire l'elenco dei buffer

Sep 02 2020

Molto spesso, dopo giorni e giorni di programmazione, aprendo vim -S sessionogni volta, mi ritrovo con una lunga lista di buffer che voglio pulire.

Pertanto uso :lsper elencare tutti i buffer, e poi :bdeletepiù volte, con un intervallo di numeri di buffer e / o specificando esplicitamente i nomi dei buffer.

I punti deboli di questo approccio sono due:

  1. se corro :bdeletesu un unico buffer, le righe N buffers deletede Press ENTER or type command to continuenon vengono visualizzate e l'elenco dei buffer si chiude, quindi devo eseguire di :lsnuovo, il che è molto fastidioso;
  2. Devo correre :bdeletepiù volte, il che è meno doloroso ma comunque fastidioso.

Se esiste un modo più pulito per elencare i nomi di buffer non contigui :bdelete, sarebbe fantastico, poiché risolverebbe 1 e 2; in caso contrario, un modo per impedire la chiusura dell'output di :lssarebbe abbastanza buono, in quanto risolverebbe 2.

Modifica importante

Non voglio eliminare alcun buffer aperto in una finestra in qualsiasi scheda.

Risposte

4 Matt Sep 02 2020 at 11:23

Per la mia configurazione ho scritto questo:

~ / .vim / autoload / misc.vim

" Wipe all deleted (unloaded & unlisted) or all unloaded buffers
function! misc#bwipeout(listed) abort
    let l:buffers = filter(getbufinfo(), {_, v -> !v.loaded && (!v.listed || a:listed)})
    if !empty(l:buffers)
        execute 'bwipeout' join(map(l:buffers, {_, v -> v.bufnr}))
    endif
endfunction

~ / .vim / vimrc

" :Bwipeout[!]
" wipe all deleted/unloaded buffers
command! -bar -bang Bwipeout call misc#bwipeout(<bang>0)

Ora fai :Bwipeout!per pulire l'intero casino.

Nota: :bwipeoutdifferisce dal :bdeletefatto che elimina effettivamente il buffer, mentre :bdeletemantiene nome / numero / segnalibri locali per un successivo riutilizzo. Puoi vedere tutti i buffer "cancellati" dal comando :ls!.

Se vuoi ancora utilizzarlo :bdeletepuoi adattare facilmente il codice:

function s:bdelete() abort
    let l:buffers = filter(getbufinfo(), {_, v -> !v.loaded && v.listed})
    if !empty(l:buffers)
        execute 'bdelete' join(map(l:buffers, {_, v -> v.bufnr}))
    endif
endfunction
command! -bar Bdelete call s:bdelete()
3 MaximKim Sep 02 2020 at 11:42

Per la mia configurazione ho scritto questo:

" kill-all but visible buffers
nnoremap <silent> <M-BS> :call Delete_buffers()<CR>:echo "Non-windowed buffers are deleted"<CR>

"" Delete all(saved) but visible buffers
func! Delete_buffers()
    " all visible buffers in all tabs
    let buflist = []
    for i in range(tabpagenr('$')) call extend(buflist, tabpagebuflist(i + 1)) endfor " all existing buffers for bnr in range(1, bufnr("$"))
        if index(buflist, bnr) == -1 && buflisted(bnr)
            exe 'bd ' . bnr
        endif
    endfor
endfunc

Quindi con Alt+Backspacetutto tranne i buffer attualmente visibili nelle finestre divise vengono eliminati.

Molto utile per salvare / aggiornare la sessione senza un mucchio di buffer non necessari.

PS, aggiornato per non eliminare i buffer in altre schede.

PPS, grazie @matt, versione migliore:

func! Delete_buffers()
    let l:buffers = filter(getbufinfo(), {_, v -> v.hidden})
    if !empty(l:buffers)
        execute 'bwipeout' join(map(l:buffers, {_, v -> v.bufnr}))
    endif
endfunc