Как закрыть все буферы, которые не отображаются в окне в vim? - PullRequest
40 голосов
/ 08 октября 2009

У меня есть множество буферов, открытых в vim, только несколько из них открыты в разделенных окнах или на других вкладках. Есть ли способ закрыть все, кроме тех, которые в настоящее время видны в одном из этих разделений или вкладок?

Ответы [ 5 ]

26 голосов
/ 06 сентября 2011

Еще один взгляд на это. Используя пример, приведенный в справке 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()
21 голосов
/ 08 октября 2009

Вот альтернативное решение, которое вы можете добавить в .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().

8 голосов
/ 08 октября 2009

Добавьте это к вашему .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
3 голосов
/ 07 февраля 2010

Я знаю, почему второй скрипт не работает должным образом.

Это связано с функцией 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

Спасибо тебе.

2 голосов
/ 27 сентября 2017

Есть плагин , который делает именно это и немного больше!

Выезд close-buffers.vim

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...