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

我怎么能关闭所有缓冲区在Vim除了一个我目前正在编辑?

84545 次浏览

你可以从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

请注意:正如注释中提到的,这将关闭窗户没有缓冲

通过使用

:on[ly][!]

而且

:h only

如果你不关心当前的,更简单的做法是(不需要脚本):

1,100bd

基于juanruiz的回答。

然后,在想要保留的缓冲区中做一个小更改

:1,1000bd

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

编辑:请注意,这也会删除你的NERDTreeBuffer。你可以用NERDTree把它找回来

试试这个

bufdo bd

Bufdo为所有缓冲区运行命令

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

我这样做

:w | %bd | e#

如果我只想打开当前缓冲区,并关闭所有其他缓冲区,这是我的最爱。

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

关闭所有打开的缓冲区:

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>

我可以很容易地做到这一点,像这样:

:%bd|e#

我喜欢1,100bd (由juananruiz建议),这似乎对我有用。

我添加了一个quit!到我的映射给我

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

这会杀死所有缓冲区并关闭Vim,这正是我最想要的。

有一个插件函数可以做到这一点,甚至更多!

查看close-buffers.vim .vim

我把它放在。vimrc文件中

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

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

它的作用是

:w -保存当前缓冲区

%bd -关闭所有缓冲区

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

关闭未命名缓冲区

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

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

%bd =删除所有缓冲区。

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

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

中间的管道只是执行一个又一个命令。你必须使用\|来转义它

'" =保持光标位置。

我将亚历杭德罗的评论badteeth的评论结合起来:

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

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

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

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

nnoremap <leader>x :execute '%bdelete\|edit #\|normal `"'\|bdelete#<CR>
  • 关闭所有缓冲区(副作用创建新的空缓冲区)
  • 打开最后一个缓冲区
  • 跳转到缓冲区中的最后编辑位置
  • 删除空缓冲区
  • 票数最高的答案将重新打开缓冲区,它将失去我们正在工作的当前行。
  • 关闭然后重新打开将导致屏幕刷新
function! CloseOtherBuffer()
let l:bufnr = bufnr()
execute "only"
for buffer in getbufinfo()
if !buffer.listed
continue
endif
if buffer.bufnr == l:bufnr
continue
else
if buffer.changed
echo buffer.name . " has changed, save first"
continue
endif
let l:cmd = "bdelete " . buffer.bufnr
execute l:cmd
endif
endfor
endfunction


let mapleader = ','
nnoremap <leader>o :call CloseOtherBuffer()<CR>

当你在目标缓冲区上并按+ o时,之前的代码将生效。它将关闭除当前缓冲区外的所有其他缓冲区。

它迭代所有缓冲区,并关闭所有不等于当前缓冲区数的缓冲区数。

:%bd then Ctrl-o

:%bd删除所有缓冲区

按Ctrl-o跳转回最后一个缓冲区,这将是“This one”;你刚才提到的。