我在vim中打開了一大堆緩衝區,只有其中的幾個在分割窗口或其他選項卡中打開。有沒有辦法關閉除了當前可見的分割或製表符之外的所有分支?如何關閉在vim窗口中未顯示的所有緩衝區?
回答
這裏有一個替代的解決方案,你可以在你的.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()
。
這是否刪除修改的緩衝區? – 2011-04-11 21:16:10
atomules的答案工作,這一個刪除標籤中的緩衝區,似乎有奇怪的行爲。 – 2014-03-25 18:46:13
小心 - 'Wipeout()'將其他選項卡中的窗口(不是當前可見選項卡的選項卡)視爲不可見。 – emallove 2014-09-29 18:40:23
添加到您的.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
我可能錯誤地解釋了我的問題 - m試圖清理':ls'的輸出,這個函數似乎沒有這樣做。 – 2009-10-08 06:48:01
缺乏標籤頁支持還是其他?我已經添加了一個支持上面的標籤頁的版本。 – 2009-10-08 08:39:17
這仍然不適合我。 – 2009-10-09 19:33:33
我知道爲什麼第二個腳本無法正常工作。
這是由於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
謝謝你。
如果「bufloaded(b)」對於我們想要關閉的緩衝區完全錯誤,爲什麼不只是「if!bufloaded(b)」? – derenio 2013-11-08 14:20:59
這樣做的伎倆,但我很喜歡:Wipeout非常吸引人的命令! -nargs =?擦除呼叫CloseHiddenBuffers()' – expelledboy 2013-11-21 07:53:18
還有另外一件事情。使用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()
這打破了CommandT。我在運行Bdi後第一次激活CommandT時,得到「Vim :: DeletedBufferError:嘗試引用已刪除的緩衝區」。下次我嘗試CommandTs鍵綁定時,根本沒有任何反應,我的其他幾個鍵綁定也停止工作。 – bobpaul 2015-04-16 19:40:45
@bobpaul我不使用CommandT,但可以嘗試在函數中使用'bdelete'而不是'bwipeout'。這可能會讓CommandT變得更糟。 – atomicules 2015-04-17 11:35:03
嗨原子尺,我想你的功能,我得到了一堆像這樣的錯誤:http://trusktr.io:7777/isowiyirid.rb。有任何想法嗎? – trusktr 2016-01-09 04:14:07
有一個插件認爲正是這一點,多一點!
- 1. Vim關閉窗口而不關閉緩衝區
- 2. 在預覽窗口中打開新緩衝區時佔用Vim預覽窗口的自動關閉緩衝區
- 3. Vim關閉緩衝區但不分割窗口
- 4. Vim-airline關閉緩衝區/退出vim
- 5. 如何在vim中的窗口中修復緩衝區?
- 6. 如何在新窗口中顯示「任何」緩衝區
- 7. vim - 如何關閉當前選項卡中的所有緩衝區?
- 8. 關閉緩衝區後顯示Emacs緩衝區
- 9. 如何在vim中關閉緩衝區時執行命令?
- 10. 如何綁定q關閉Vim中的只讀緩衝區?
- 11. XEmacs緩衝區選項卡不顯示所有緩衝區
- 12. gVim/Vim - 如何將vim緩衝區寫入新的(非vim)窗口?
- 13. 在最近Emacs的其他窗口中顯示緩衝區
- 14. 如何在焦點位於緩衝區列表中的其他窗口中實時顯示緩衝區內容
- 15. 如何過濾緩衝區列表以僅顯示在窗口中不可見的緩衝區
- 16. 在Emacs中拆分窗口 - Tabbar只顯示活動緩衝區
- 17. Vim minibufexplorer僅顯示當前vim標籤中的緩衝區
- 18. 如何在Vim中複製緩衝區?
- 19. Vim - 每次關閉緩衝區時停止緩衝區編號自動遞增
- 20. 有沒有辦法顯示Linux緩衝區緩存未命中?
- 21. 如何關閉所有窗口
- 22. 在vim中的所有緩衝區中運行一個宏
- 23. 如何在新窗口顯示後關閉當前窗口
- 24. [emacs] [gdb自定義]如何在一個窗口中顯示源緩衝區?
- 25. 如何關閉輸入/輸出緩衝區中的輸入/輸出緩衝區
- 26. Vim在切換緩衝區時保持窗口位置
- 27. vim在關閉後不保存緩衝區歷史記錄
- 28. 終端 - 在新的vim緩衝區中顯示輸出
- 29. 刷新緩衝區中的所有文件在vim
- 30. 平坦的窗口/緩衝區上的所有observables
作爲參考,我發現這個[雅虎的Vim組線程(http://tech.groups.yahoo.com/group/vim/message/56425)之前,我碰到這個來了SO問答。這裏的答案更好,因爲他們處理標籤頁。 – atomicules 2011-09-06 13:35:44
Artem Nezvigin已將下面的無數解決方案改編成一個插件,[wipeout.vim](http://www.vim.org/scripts/script.php?script_id=4882) – 2014-03-03 19:17:31