我有類似120緩衝區在Vim中打開的東西。大約50%的這些緩衝區都是空文件。我想以某種方式使用bufdo!
關閉所有空的緩衝區。有沒有一種方法,我可以說:刪除VIM中的所有空緩衝區
bufdo! (something)
凡(something)
是有條件的命令bdelete
S中如果當前緩衝區緩衝區的長度/大小爲零?
我有類似120緩衝區在Vim中打開的東西。大約50%的這些緩衝區都是空文件。我想以某種方式使用bufdo!
關閉所有空的緩衝區。有沒有一種方法,我可以說:刪除VIM中的所有空緩衝區
bufdo! (something)
凡(something)
是有條件的命令bdelete
S中如果當前緩衝區緩衝區的長度/大小爲零?
我唯一能想到的就是創建一個報告緩衝區是否爲空的函數。事情是這樣的:
function! BufferIsEmpty()
if line('$') == 1 && getline(1) == ''
return 1
else
return 0
endif
endfunction
" Test it like this:
echo BufferIsEmpty()
由於不允許用 影響緩存列表中: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()
返回 空列表,無論其內容如何)都可以獲得內容。
我一直在使用下面的函數來完成這項工作:
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緩衝區(顯示在任何其他空的緩衝區一個窗口)
注意:':bufdo'-argument命令不能添加或刪除緩衝區(參見':help:bufdo')。 –