2009-10-07 39 views
38

我在vim中打開了一大堆緩衝區,只有其中的幾個在分割窗口或其他選項卡中打開。有沒有辦法關閉除了當前可見的分割或製表符之外的所有分支?如何關閉在vim窗口中未顯示的所有緩衝區?

+1

作爲參考,我發現這個[雅虎的Vim組線程(http://tech.groups.yahoo.com/group/vim/message/56425)之前,我碰到這個來了SO問答。這裏的答案更好,因爲他們處理標籤頁。 – atomicules 2011-09-06 13:35:44

+1

Artem Nezvigin已將下面的無數解決方案改編成一個插件,[wipeout.vim](http://www.vim.org/scripts/script.php?script_id=4882) – 2014-03-03 19:17:31

回答

21

這裏有一個替代的解決方案,你可以在你的.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()

+1

這是否刪除修改的緩衝區? – 2011-04-11 21:16:10

+0

atomules的答案工作,這一個刪除標籤中的緩衝區,似乎有奇怪的行爲。 – 2014-03-25 18:46:13

+0

小心 - 'Wipeout()'將其他選項卡中的窗口(不是當前可見選項卡的選項卡)視爲不可見。 – emallove 2014-09-29 18:40:23

8

添加到您的.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 
+0

我可能錯誤地解釋了我的問題 - m試圖清理':ls'的輸出,這個函數似乎沒有這樣做。 – 2009-10-08 06:48:01

+0

缺乏標籤頁支持還是其他?我已經添加了一個支持上面的標籤頁的版本。 – 2009-10-08 08:39:17

+0

這仍然不適合我。 – 2009-10-09 19:33:33

3

我知道爲什麼第二個腳本無法正常工作。

這是由於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 

謝謝你。

+0

如果「bufloaded(b)」對於我們想要關閉的緩衝區完全錯誤,爲什麼不只是「if!bufloaded(b)」? – derenio 2013-11-08 14:20:59

+0

這樣做的伎倆,但我很喜歡:Wipeout非常吸引人的命令! -nargs =?擦除呼叫CloseHiddenBuffers()' – expelledboy 2013-11-21 07:53:18

24

還有另外一件事情。使用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() 
+0

這打破了CommandT。我在運行Bdi後第一次激活CommandT時,得到「Vim :: DeletedBufferError:嘗試引用已刪除的緩衝區」。下次我嘗試CommandTs鍵綁定時,根本沒有任何反應,我的其他幾個鍵綁定也停止工作。 – bobpaul 2015-04-16 19:40:45

+0

@bobpaul我不使用CommandT,但可以嘗試在函數中使用'bdelete'而不是'bwipeout'。這可能會讓CommandT變得更糟。 – atomicules 2015-04-17 11:35:03

+0

嗨原子尺,我想你的功能,我得到了一堆像這樣的錯誤:http://trusktr.io:7777/isowiyirid.rb。有任何想法嗎? – trusktr 2016-01-09 04:14:07

相關問題