如何在Vim中删除多个缓冲区?

Tha*_* DK 110 vim buffer

假设我在Vim中打开了多个文件作为缓冲区.文件有*.cpp,*.h有些是*.xml.我想关闭所有的XML文件:bd *.xml.但是,Vim不允许这样做(E93:不止一场比赛......).

有没有办法做到这一点?

PS我知道:bd file1 file2 file3有效.所以,我可以采用某种评估*.xmlfile1.xml file2.xml file3.xml

Bjö*_*ink 172

您可以<C-a>用来完成所有比赛.因此,如果您键入:bd *.xml然后点击<C-a>,vim将完成命令:bd file1.xml file2.xml file3.xml.

  • @Florian` <tab>`只允许你循环匹配,在命令行上放一个条目,`<Ca>`一次添加所有匹配. (8认同)
  • JFTR,如果您安装了[`vim-rsi`](https://github.com/tpope/vim-rsi)(我认为,对于\*nix上的所有人来说都是必须的),以获得`< Ca>`在命令行中使用原始方式,你应该使用`<Cx>``<Ca>`. (6认同)
  • 真棒!不需要插件:)谢谢. (4认同)
  • 默认情况下,tmux不绑定<Ca>,但如果您将其配置为例如使用<Ca>而不是<Cb>来模拟屏幕,则还应将其配置为映射,例如,<Ca> a以传递< Ca>通过在tmux中运行的程序.tmux附带的screen-keys.conf就是这样做的. (4认同)
  • 或者`<tab>`而不是`<ca>`,也可以. (3认同)

Fis*_*man 33

:3,5bd[elete]   
Run Code Online (Sandbox Code Playgroud)

将删除缓冲区范围从3到5.

  • 如果要删除单个缓冲区,例如 3 和 5,请使用 `:bd 3 5`。 (9认同)

Cyl*_*ian 16

你也可以使用:

    :.,$-bd[elete]    " to delete buffers from the current one to last but one
    :%bd[elete]       " to delete all buffers
Run Code Online (Sandbox Code Playgroud)


Luc*_*tte 5

你可以用它.

:exe 'bd '. join(filter(map(copy(range(1, bufnr('$'))), 'bufname(v:val)'), 'v:val =~ "\.xml$"'), ' ')
Run Code Online (Sandbox Code Playgroud)

将它添加到命令应该很容易.

function! s:BDExt(ext)
  let buffers = filter(range(1, bufnr('$')), 'buflisted(v:val) && bufname(v:val) =~ "\.'.a:ext.'$"')
  if empty(buffers) |throw "no *.".a:ext." buffer" | endif
  exe 'bd '.join(buffers, ' ')
endfunction

command! -nargs=1 BDExt :call s:BDExt(<f-args>)
Run Code Online (Sandbox Code Playgroud)


Hab*_*abi 5

试试下面的脚本.该示例用于"txt",根据需要将其更改为例如"xml".修改的缓冲区不会被删除.按\ bd删除缓冲区.

map <Leader>bd :bufdo call <SID>DeleteBufferByExtension("txt")

function!  <SID>DeleteBufferByExtension(strExt)
   if (matchstr(bufname("%"), ".".a:strExt."$") == ".".a:strExt )
      if (! &modified)
         bd
      endif
   endif
endfunction
Run Code Online (Sandbox Code Playgroud)

[编辑] 同样没有:bufdo(根据Luc Hermitte的要求,见下面的评论)

map <Leader>bd :call <SID>DeleteBufferByExtension("txt")

function!  <SID>DeleteBufferByExtension(strExt)
   let s:bufNr = bufnr("$")
   while s:bufNr > 0
       if buflisted(s:bufNr)
           if (matchstr(bufname(s:bufNr), ".".a:strExt."$") == ".".a:strExt )
              if getbufvar(s:bufNr, '&modified') == 0
                 execute "bd ".s:bufNr
              endif
           endif
       endif
       let s:bufNr = s:bufNr-1
   endwhile
endfunction
Run Code Online (Sandbox Code Playgroud)

  • 完成.见上面的[编辑]. (2认同)