web-dev-qa-db-ja.com

Vimで複数のバッファーを削除する方法は?

Vimのバッファーとして複数のファイルを開いていると仮定します。ファイルには*.cpp*.hがあり、一部は*.xmlです。すべてのXMLファイルを:bd *.xmlで閉じたい。ただし、Vimはこれを許可しません(E93:複数の一致...)。

これを行う方法はありますか?

追伸:bd file1 file2 file3が機能することを知っています。だから、どういうわけか*.xmlfile1.xml file2.xml file3.xmlに評価できますか?

106
Thanh DK

<C-a>を使用して、すべての一致を完了することができます。したがって、:bd *.xmlと入力して<C-a>を押すと、vimは:bd file1.xml file2.xml file3.xmlへのコマンドを完了します。

164
:3,5bd[elete]   

3〜5のバッファ範囲を削除します。

30
Fisherman

代わりに使用することもできます:

    :.,$-bd[elete]    " to delete buffers from the current one to last but one
    :%bd[elete]       " to delete all buffers
14
Cylian

以下のスクリプトを試してください。例は「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

[編集]同じ: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
5
Habi

これを使用できます。

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

コマンドに簡単に追加できるはずです。

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>)
5
Luc Hermitte

私もこの機能を常に必要としていました。これがvimrcにある解決策です。

_function! GetBufferList()
    return filter(range(1,bufnr('$')), 'buflisted(v:val)')
endfunction

function! GetMatchingBuffers(pattern)
    return filter(GetBufferList(), 'bufname(v:val) =~ a:pattern')
endfunction

function! WipeMatchingBuffers(pattern)
    let l:matchList = GetMatchingBuffers(a:pattern)

    let l:count = len(l:matchList)
    if l:count < 1
        echo 'No buffers found matching pattern ' . a:pattern
        return
    endif

    if l:count == 1
        let l:suffix = ''
    else
        let l:suffix = 's'
    endif

    exec 'bw ' . join(l:matchList, ' ')

    echo 'Wiped ' . l:count . ' buffer' . l:suffix . '.'
endfunction

command! -nargs=1 BW call WipeMatchingBuffers('<args>')
_

これで、_:BW regex_(たとえば_:BW \.cpp$_)を実行して、パス名でそのパターンに一致するすべての一致するバッファーを消去できます。

ワイプではなく削除する場合は、もちろんexec 'bw ' . join(l:matchList, ' ')exec 'bd ' . join(l:matchList, ' ')に置き換えることができます

3
Kent

非常に簡単::bd[elete]コマンドを使用します。たとえば、:bd[elete] buf#1 buf#5 buf#3は、バッファー1、3、および5を削除します。

1
Harry

TABは、Vim 7.4.282の時点で1つのファイルのみを自動補完します
使用する <c-a>すべてのファイルを自動補完します。

あなただけを使用することができます:

bd filetype

その後、単に<c-a>指定されたファイルタイプのすべての開いているファイルの完了を容易にします。

たとえば、1.xml、2.xml、3.xml、および4.xmlがある場合、次を実行できます。

bd xml

<c-a>

vimは次のように自動補完します。

bd 1.xml 2.xml 3.xml 4.xml

enterキーを押すだけでコマンドを完了できます。

上記のファイルのいずれかを変更した場合は、忘れずに実行してください。

bd! xml
0
stucash