Vim:关闭所有缓冲区,但是这一个


Answers:



171

试试这个

bufdo bd

bufdo对所有缓冲区运行命令

http://vim.wikia.com/wiki/Run_a_command_in_multiple_buffers


这不会关闭NERDTree缓冲区。
乌里(Uri)

如果焦点在书呆子树面板中,则NERDTree将关闭
gayavat 2015年

2
您可能需要在执行此操作之前先关闭NERDTree,以防止bd命令关闭vim本身。nnoremap <silent> <leader>c :NERDTreeClose<bar>bufdo bd<CR>
lvarayut

11
文档警告说,:bufdo“不得删除缓冲区或将缓冲区添加到缓冲区列表”的参数。因此,如果此解决方案有效,那么它是偶然发生的……对我而言通常不起作用(切换到其他缓冲区)。
2016年

10
这为我关闭了所有缓冲区,这不是问题要问的。(MacVim版本8.0.1207)
迈克尔·伦纳德

143

我能够像这样很容易地做到这一点:

:%bd|e#

4
这是一个很好的答案。除非您使用BufOnly的参数传递功能,否则它会使BufOnly感觉有些矫over过正(我是说,整个插件?)。我真正想做的就是:%bd|e#
shmup

41
@jorgeh %bd=删除所有缓冲区。e#=打开最后一个缓冲区进行编辑。之间的管道只是一个接一个地执行命令。
OldTimeGuitarGuy

20
@Jared您可以%bd|e#|bd#用来删除[No Name]创建的缓冲区。
kshenoy

12
精彩。然后,这里只有我用过的BufOnly插件,它被提炼为一个命令:command! BufOnly silent! execute "%bd|e#|bd#"
shmup

4
@Finn你需要逃避|map <leader>o :%bd\|e#<cr>
哈利勒Özgür的

57

如果您不关心当前的脚本,则可以更简单地执行以下操作(无需脚本):

1,100bd

4
它将同时关闭nerdtree缓冲区。
Afshin Mehrabani 2014年

启用NERDTree时,使用此命令遇到一些问题。我建议使用@VoY提到的BufOnly.vim插件。
moeabdol 2015年

1
我进行了以下映射,这些映射说明了删除NERDTree缓冲区的情况:nnoremap <leader>bd :%bd | NERDTree<cr>
Uri

5
我使用了很长一段时间,但现在知道了,E16: Invalid range因为该范围内的某些缓冲区实际上并不存在。直到最近,它一直在忽略它。
2015年

3
@Jon检查:ls以查看您实际上已打开的最大缓冲区,并将范围设置为该范围(即,如果最大缓冲区为22,则为:1,22bd)。在执行此操作之前,我遇到了同样的错误。
乃柔

51

我做这个

:w | %bd | e#

我最喜欢的是我只想打开当前缓冲区并关闭所有其他缓冲区。

工作原理:首先写入当前缓冲区的更改,然后关闭所有打开的缓冲区,然后重新打开我当前所在的缓冲区。在Vim中,将|命令的执行链接在一起。如果您的缓冲区是最新的,则以上内容可以缩短为:%bd | e#


它通常可以正常工作。但有时%不能作为所有选择器。你能猜到什么吗?
Jinyoung Kim

@JinyoungKim(来自[1])在“:%bd”命令中,'%'范围将替换为当前缓冲区中的开始和结束行号。您应该为范围指定数字,而不是使用“%”作为范围。例如,要删除所有缓冲区,可以使用命令“:1,9999bd” [1] vimdoc.sourceforge.net/cgi-bin/vimfaq2html3.pl#8.8
iamnotsam 2015年

我刚刚签出了文件。那么,“%”范围取决于当前文件行数吗?
Jinyoung Kim 2015年

2
我发现内置函数bufnr("$")返回最后一个缓冲区号。但是当我这样使用时我不知道要插值到字符串:1,bufnr("$")bd。也许..最佳解决方案是:1,9999bd
Jinyoung Kim

2
:help :bd显示:%bdelete " delete all buffers。所以%正是您想要的。我使用您的解决方案的变体::%bd<CR><C-O>:bd#<CR>这将删除所有缓冲区,然后用于<C-O>恢复当前文件中的位置,然后:bd#删除未修饰的缓冲区。这将关闭所有缓冲区,并将您留在文件中的相同位置。
亚历杭德罗

25

建立在juananruiz的答案上。

在要保留的缓冲区中进行一些小的更改,然后

:1,1000bd

该命令bd(缓冲区删除)将不会删除任何未保存更改的缓冲区。这样,您可以将当前(更改的)文件保留在缓冲区列表中。

编辑:请注意,这还将删除您的NERDTreeBuffer。你可以用:NERDTree找回来


完美,简短,简单!:)
arkod 2014年

49
:%bd实际上是“全部”,而不是1-1000。
约翰·泰瑞

是否依赖于set nohidden设置?
费利佩·阿尔瓦雷斯

15

通过使用

:on[ly][!]

:h only

27
这将关闭窗口,而不是缓冲区。
ZyX 2012年

13
仍然有用,因为人们可能会使用Google搜索错误的术语,并且会发现这一点。因此,感谢你们俩。:)
archgoon

1
@archgoon是的,但是应该在答案中指定。
andho

10

关闭所有打开的缓冲区:

silent! execute "1,".bufnr("$")."bd"

关闭所有打开的缓冲区(当前缓冲区除外)

function! CloseAllBuffersButCurrent()
  let curr = bufnr("%")
  let last = bufnr("$")

  if curr > 1    | silent! execute "1,".(curr-1)."bd"     | endif
  if curr < last | silent! execute (curr+1).",".last."bd" | endif
endfunction

将此函数添加到.vimrc并使用调用它:call CloseAllBuffersButCurrent()

便捷地图:

nmap <Leader>\c :call CloseAllBuffersButCurrent()<CR>

我注意到在恢复vim会话时(确实会还原缓冲区),我再也无法使用上述方法删除缓冲区。相反,我不得不使用:%bd|e#|bd#
shmup '18

最佳解决方案。我添加了一个命令来重新打开NERDTreenmap <Leader>\c :call CloseAllBuffersButCurrent()<CR>:NERDTree<CR>
Gjaa

5

我把它放在我的.vimrc文件中

nnoremap <leader>ca :w <bar> %bd <bar> e# <bar> bd# <CR>

然后leader + ca(全部关闭)关闭除当前缓冲区以外的所有缓冲区。

它的作用是

:w-保存当前缓冲区

%bd-关闭所有缓冲区

e#-打开最后编辑的文件

bd#-关闭未命名的缓冲区



1

这就是我的工作。因此,我希望在删除所有缓冲区后保持光标位置,并且上面的大多数解决方案都忽略了这一事实。我还认为重新映射命令比键入命令更好,因此在这里我<leader>bd用来删除所有缓冲区并跳回到我的原始光标位置。

noremap <leader>bd :%bd\|e#\|bd#<cr>\|'"

%bd =删除所有缓冲区。

e# =打开最后一个缓冲区进行编辑(我正在使用的缓冲区是哪个)。

bd#删除使用时创建的[无名称]缓冲区%bd

之间的管道只是一个接一个地执行命令。您必须通过使用来摆脱它\|

'" =保持我的光标位置。


0

我喜欢1,100bdjuananruiz建议)似乎对我有用

quit!在映射中添加了一个

nnoremap <leader>bd :1,100bd<CR>
nnoremap <leader>bdq :1,100bd<CR>:q!<CR>

这会杀死所有缓冲区并关闭Vim,这正是我一直在寻找的东西。


1
确实没有理由让您使用bdq关闭所有缓冲区并退出vim 的映射,:q!而只能使用:qa!。除非我忽略了什么
shmup '18

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.