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

时间:2010-12-28 10:14:28

标签: vim

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

16 个答案:

答案 0 :(得分:141)

试试这个

bufdo bd

bufdo运行所有缓冲区的命令

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

答案 1 :(得分:79)

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

:%bd|e#

答案 2 :(得分: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

答案 3 :(得分:54)

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

1,100bd

答案 4 :(得分:44)

我这样做

:w | %bd | e#

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

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

答案 5 :(得分:25)

以juananruiz的回答为基础。

对要保留的缓冲区进行少量更改,然后

:1,1000bd

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

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

答案 6 :(得分:13)

使用

:on[ly][!]

:h only

答案 7 :(得分:7)

关闭所有打开的缓冲区:

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>

答案 8 :(得分:3)

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

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

%bd =删除所有缓冲区。

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

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

之间的管道只是一个接一个地执行命令。您必须使用\|

逃脱它

'" =保持光标位置。

答案 9 :(得分:2)

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

查看 close-buffers.vim

答案 10 :(得分:1)

我将其放在我的.vimrc文件中

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

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

它的作用是

:w-保存当前缓冲区

%bd-关闭所有缓冲区

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

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

答案 11 :(得分:1)

所以这是一个老问题,但它帮助我为我的项目获得了一些想法。为了关闭除您当前使用的缓冲区之外的所有缓冲区,请使用;

map <leader>o :execute "%bd\|e#"<CR>

答案 12 :(得分:0)

答案 13 :(得分:0)

我喜欢1,100bdsuggested by juananruiz),这似乎对我有用。

我在我的地图中添加了quit!给我

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

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

答案 14 :(得分:0)

我将 Alejandro's commentbadteeth's comment 结合:

command! Bonly silent execute "%bd|norm <C-O>"
  • norm <C-O> 跳转到跳转列表中的最后一个位置,表示光标在 %bd 之前的位置。
  • 我使用了 silent 而不是 silent!。这样,如果任何打开的缓冲区被修改,Vim 就会打印一条错误消息,以便我知道发生了什么。修改后的缓冲区在我的测试中保持打开状态。

无关:这是我的第 500 个回答!

答案 15 :(得分:0)

nnoremap <leader>x :execute '%bdelete\|edit #\|normal `"'\|bdelete#<CR>
  • 关闭所有缓冲区(副作用会创建新的空缓冲区)
  • 打开最后一个缓冲区
  • 跳转到缓冲区中的最后一个编辑位置
  • 删除空缓冲区