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


120

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

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

PS私はそれが:bd file1 file2 file3うまくいくことを知っています。だから私は何とか評価できる*.xmlfile1.xml file2.xml file3.xml

回答:


194

を使用<C-a>して、すべての試合を完了することができます。したがって、タイプして:bd *.xmlからを<C-a>押すと、vimはへのコマンドを完了し:bd file1.xml file2.xml file3.xmlます。


8
@Florian <tab>は、一致を循環することのみを許可し、コマンドラインに単一のエントリを入力し、<C-a>すべての一致を一度に追加します。
ビョルンスタインブリンク2013

私の神、あなたは正しい!ごめんなさい。タブは、結果が1つしかない場合にのみ機能します。
Florian Klein

tmuxのvimで<Ca>をどのように使用しますか?
nabn

4
tmuxはデフォルトで<Ca>をバインドしませんが、<Cb>の代わりに<Ca>を使用して画面をエミュレートするように構成した場合は、たとえば<Ca> aをマップして<を渡すように構成する必要があります。 Ca>からtmux内で実行されているプログラムまで。tmuxに付属のscreen-keys.confがそれを行います。
ビョルンスタインブリンク

7
JFTRをvim-rsiインストールした場合(私は、* nixのすべての人にとって必要なものだと思います)、<C-a>コマンドラインで元の方法で作業を行うには、<C-x> <C-a>代わりに使用する必要があります。
kostix 2017

43
:3,5bd[elete]   

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


19

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

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

1
これはうまくいきます。私がやるLS:数字をバッファリングし、それらを参照するには、BBD: Bに数aから削除バッファに
NeaţuOvidiuさんガブリエル

5

これを使えます。

: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>)

Vimscriptについてはほとんど何も知りませんが、glob()関数はどうですか?
Thanh DK

1
glob()(ハードドライブ上の)既存のファイルのみが提供され、開いているバッファは提供されません。
Luc Hermitte、2010

fnameescape()名前をバッファするのを忘れました。
ZyX 2012年

で確認したところc:/Program files/foo.barfoo.bar.foo完全に機能しました。fnameescape()バッファ名を使用した場合は、必要だったかもしれません。しかし、バッファ名が指定された式と一致するかどうかだけをチェック\.{ext}$しています。--bd`にバッファ番号を与えます。正規表現マッチングのために何かをエスケープする理由は何もありません。
Luc Hermitte、2012年

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

[編集] :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

1
:bufdo現在のウィンドウを混乱させるので、私は気に入らない。
Luc Hermitte、2010

3

私も常にこの機能を必要としていました。これは私の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, ' ')


Vimはどこにでも(正規表現をサポートしていない理由を私は時々不思議:badd:bdelete:bufdo:bn...)
PUK

1

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


1

TABVim 7.4.282以降、すべてのファイルをオートコンプリート
する<c-a>ために使用されるのは、1つのファイルのみオートコンプリートされます。

あなたはただ使うことができます:

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.