我在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