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

Raf*_*fid 177 vim

如何关闭Vim中除我正在编辑的缓冲区之外的所有缓冲区?

gay*_*vat 153

试试这个

bufdo bd
Run Code Online (Sandbox Code Playgroud)

bufdo为所有缓冲区运行命令

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

  • 该文档警告说,[`:bufdo`](http://vimdoc.sourceforge.net/htmldoc/windows.html#:bufdo)'的参数不得删除缓冲区或将缓冲区添加到缓冲区列表中.因此,如果这个解决方案有效,它会偶然工作......它通常对我不起作用(切换到不同的缓冲区). (9认同)
  • 这为我关闭了所有缓冲区,这不是问题要问的。(MacVim版本8.0.1207) (4认同)
  • 此命令关闭所有缓冲区。我怎样才能保持当前的打开状态? (4认同)
  • 这不会关闭 NERDTree 缓冲区。 (3认同)
  • 您可能希望在执行此操作之前关闭 NERDTree 以防止 `bd` 命令关闭 vim 本身;`nnoremap <silent> <leader>c :NERDTreeClose<bar>bufdo bd<CR>`。 (3认同)
  • @gayavat 我刚刚尝试了`:only`。它不会关闭缓冲区,除非您设置了“隐藏”。 (2认同)

Old*_*Guy 108

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

:%bd|e#
Run Code Online (Sandbox Code Playgroud)

  • @jorgeh`%bd` =删除所有缓冲区.`e#`=打开最后一个缓冲区进行编辑.介于两者之间的管道只能执行一个接一个的命令. (29认同)
  • @Jared您可以使用`%bd | e#| bd #`删除创建的`[No Name]`缓冲区. (12认同)
  • @Finn 你需要转义 `|`:`map <leader>o :%bd\|e#<cr>` (8认同)
  • 精彩.然后在这里你有我唯一使用BufOnly插件的东西,蒸馏到一个命令:`command!BufOnly沉默!执行"%bd | e#| bd#"` (6认同)
  • 这是一个很好的答案.它让BufOnly感觉有点矫枉过正(我的意思是,整个插件?)除非你使用BufOnly的参数传递功能.我真正想做的就是`:%bd | e#` (3认同)

jua*_*uiz 57

如果你不关心当前的那个,那么做更简单的事情(不需要脚本):

1,100bd
Run Code Online (Sandbox Code Playgroud)

  • 我用了很长时间,但是现在我得到了'E16:无效范围',因为范围内的某些缓冲区实际上并不存在.直到最近才忽略了这一点. (5认同)
  • 它也将关闭nerdtree缓冲区. (4认同)
  • @Jon检查`:ls`看你实际打开的最大缓冲区,并设置你的范围(即如果你的最高缓冲区是22,那么`:1,22bd`).直到我这样做,我才得到同样的错误. (3认同)

VoY*_*VoY 56

您可以使用vim.org中的此脚本:

http://www.vim.org/scripts/script.php?script_id=1071

只需将它放到您的.vim/plugin目录中,然后使用:BufOnly命令关闭所有缓冲区,但关闭活动缓冲区.您也可以将它映射到您喜欢的其他位置.vimrc.

Github上的源代码(通过vim-scripts镜像):https://github.com/vim-scripts/BufOnly.vim/blob/master/plugin/BufOnly.vim


iam*_*sam 48

我这样做

:w | %bd | e#
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我发现内置函数`bufnr(“ $”)`返回最后一个缓冲区号。但是当我像这样使用`:1,bufnr(“ $”)bd`时,我不知道要插值到字符串。也许..最好的解决办法是`:1,9999bd`。 (2认同)
  • `:help:bd`显示`:%bdelete“删除所有缓冲区。所以`%`正是您想要的。我使用您的解决方案的变体:`:%bd <CR> <CO>:bd#<CR >`这将删除所有缓冲区,然后使用<CO>来恢复当前文件中的位置,然后使用:bd#删除未修饰的缓冲区,这将关闭所有缓冲区并使您位于文件中的相同位置。文件。 (2认同)

cut*_*ine 25

建立在jananruiz的答案.

然后,对要保留的缓冲区进行一些小改动

:1,1000bd

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

编辑:请注意,这也将删除您的NERDTreeBuffer.您可以通过以下方式获取:NERDTree

  • :%bd实际上是"全部"而不是1-1000. (48认同)

klo*_*kop 13

通过使用

:on[ly][!]
Run Code Online (Sandbox Code Playgroud)

:h only
Run Code Online (Sandbox Code Playgroud)

  • 这会关闭窗口,而不是缓冲区. (24认同)
  • 仍然有用,因为人们可能会谷歌搜索错误的术语,并会发现这一点.谢谢你们俩.:) (12认同)
  • @archgoon 是的,但应该在答案中指定。 (2认同)

Yul*_*lin 12

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

nnoremap <leader>ca :w <bar> %bd <bar> e# <bar> bd# <CR>
Run Code Online (Sandbox Code Playgroud)

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

它的作用是

:w - 保存当前缓冲区

%bd - 关闭所有缓冲区

e# - 打开上次编辑的文件

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


小智 9

关闭所有打开的缓冲区:

silent! execute "1,".bufnr("$")."bd"
Run Code Online (Sandbox Code Playgroud)

关闭除当前缓冲区之外的所有打开缓冲区:

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
Run Code Online (Sandbox Code Playgroud)

添加此功能.vimrc并使用它来调用它:call CloseAllBuffersButCurrent().

便利地图:

nmap <Leader>\c :call CloseAllBuffersButCurrent()<CR>
Run Code Online (Sandbox Code Playgroud)


Moh*_*med 8

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

noremap <leader>bd :%bd\|e#\|bd#<cr>\|'"
Run Code Online (Sandbox Code Playgroud)

%bd = 删除所有缓冲区。

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

bd#删除使用时创建的 [No Name] 缓冲区%bd

中间的管道只是一个接一个地执行命令。你必须逃脱它虽然使用\|

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


Nik*_*lic 6

有一个插件可以做到这一点,还有更多!

查看close-buffers.vim


小智 6

:%bd then Ctrl-o
Run Code Online (Sandbox Code Playgroud)

:%bd 删除所有缓冲区

Ctrl-o 跳回到最后一个缓冲区,这就是您所指的“This One”。