2011-07-01 51 views
15

我有類似120緩衝區在Vim中打開的東西。大約50%的這些緩衝區都是空文件。我想以某種方式使用bufdo!關閉所有空的緩衝區。有沒有一種方法,我可以說:刪除VIM中的所有空緩衝區

bufdo! (something) 

(something)是有條件的命令bdelete S中如果當前緩衝區緩衝區的長度/大小爲零?

+0

注意:':bufdo'-argument命令不能添加或刪除緩衝區(參見':help:bufdo')。 –

回答

6

我唯一能想到的就是創建一個報告緩衝區是否爲空的函數。事情是這樣的:

function! BufferIsEmpty() 
    if line('$') == 1 && getline(1) == '' 
     return 1 
    else 
     return 0 
    endif 
endfunction 

" Test it like this: 
echo BufferIsEmpty() 
+2

類似的情況:'line2byte(line(「$」)+ 1)<= 2'。 – ZyX

+0

@ZyX:爲什麼不'line2byte(line('$'))<2'? –

+0

@ib'vim -u NONE -N -c'call setline(「。」,「abc」)| echo line2byte(line(「$」))'' – ZyX

12

由於不允許用 影響緩存列表中:bufdo -argument命令(見:help :bufdo),我們不得不使用更多的 羅嗦又相當簡單的Vim腳本。

了以下功能枚舉所有現有的緩衝區數和刪除 那些不具有名稱(在 界面顯示爲[No Name])和任何未保存的更改。 (後者由 :bdelete命令保證,該命令不帶!符號,不會刪除 修改後的緩衝區)。

function! DeleteEmptyBuffers() 
    let [i, n; empty] = [1, bufnr('$')] 
    while i <= n 
     if bufexists(i) && bufname(i) == '' 
      call add(empty, i) 
     endif 
     let i += 1 
    endwhile 
    if len(empty) > 0 
     exe 'bdelete' join(empty) 
    endif 
endfunction 

如果您想徹底刪除空的緩衝器,包括卸載 的,考慮(小心!)與bwipeout更換bdelete(見 :help :bd:help :bw)。

要測試要刪除的緩衝區的內容,請使用getbufline()函數。 例如,要確保緩衝區中不包含文本, 修改while循環內的if語句,如下所示。

if bufloaded(i) && bufname(i) == '' && getbufline(i, 1, 2) == [''] 

注意bufexists()更改爲bufloaded()這裏。這是必需的,因爲只有那些加載了緩衝區的 (對於卸載緩衝區getbufline()返回 空列表,無論其內容如何)都可以獲得內容。

9

我一直在使用下面的函數來完成這項工作:

function! s:CleanEmptyBuffers() 
    let buffers = filter(range(1, bufnr('$')), 'buflisted(v:val) && empty(bufname(v:val)) && bufwinnr(v:val)<0 && !getbufvar(v:val, "&mod")') 
    if !empty(buffers) 
     exe 'bw ' . join(buffers, ' ') 
    endif 
endfunction 

這是非常相似的,只要到IB的版本,但它留下單獨的quickfix緩衝區(顯示在任何其他空的緩衝區一個窗口)