Vim'de birden çok tampon nasıl silinir?


120

Vim'de tampon olarak açılmış birden fazla dosyam olduğunu varsayarsak. Dosyalar var *.cpp, *.hve bazıları *.xml. Tüm XML dosyalarını ile kapatmak istiyorum :bd *.xml. Ancak Vim buna izin vermiyor (E93: Birden fazla maç ...).

Bunu yapmanın bir yolu var mı?

PS Bunun :bd file1 file2 file3işe yaradığını biliyorum . Bir şekilde Yani değerlendirebilir *.xmliçin file1.xml file2.xml file3.xml?

Yanıtlar:


194

<C-a>Tüm maçları tamamlamak için kullanabilirsiniz . Yani yazıp :bd *.xmlsonra vurursanız <C-a>, vim komutunu tamamlayacaktır :bd file1.xml file2.xml file3.xml.


8
@Florian <tab>sadece eşleşmeler arasında geçiş yapmanıza izin verir, komut satırına tek bir giriş koyarak <C-a>tüm eşleşmeleri bir kerede ekler.
Björn Steinbrink

Tanrım haklısın! afedersiniz. sekmesi yalnızca tek bir olası sonuç olduğunda çalışır.
Florian Klein

Tmux üzerinde vim ile <Ca> 'yı nasıl kullanıyorsunuz?
nabn

4
tmux varsayılan olarak <Ca> 'yı bağlamaz, ancak ekranı taklit etmek için <Cb> yerine <Ca> kullanacak şekilde yapılandırdıysanız, onu eşlemek için de yapılandırmalısınız, örneğin <Ca> a bir < Tmux içinde çalışan programa doğru. Tmux ile birlikte gelen screen-keys.conf bunu yapar.
Björn Steinbrink

7
JFTR'yi vim-rsikurduysanız (bence, * nix'teki herkes için olması gerekir), <C-a>işi komut satırında orijinal şekilde almak için <C-x> <C-a>bunun yerine kullanmalısınız .
kostix


19

Alternatif olarak şunları da kullanabilirsiniz:

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

1
Bu güzel çalışıyor. A : ls tampon numaralarını ve onları görmek için : a, bbd tamponları a numarasından b numarasına silmek için
Neaţu Ovidiu Gabriel

5

Bunu kullanabilirsin.

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

Bir komuta eklemek oldukça kolay olmalı.

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 hakkında hiçbir şey bilmiyorum ama glob () işlevi nasıl olur?
Thanh DK

1
glob()size yalnızca mevcut dosyaları (sabit sürücünüzde) verir ve arabellekleri açmaz.
Luc Hermitte

fnameescape()İsimleri tamponlamayı unuttunuz .
ZyX 02

Daha yeni kontrol ettim c:/Program files/foo.barve hatta foo.bar.foomükemmel çalıştı. fnameescape()tampon adlarını kullanırsam gerekli olabilir. Ama sadece tampon isimlerinin verilen bir ifadeyle eşleşip eşleşmediğini kontrol \.{ext}$ediyorum : - Tampon numaralarını: bd`ye veriyorum. Normal ifade eşleşmesi için hiçbir şeyden kaçmak için herhangi bir nedenim yok.
Luc Hermitte

5

Aşağıdaki komut dosyasını deneyin. Örnek "txt" içindir, gerektiği gibi değiştirin, örneğin "xml" olarak. Değiştirilen tamponlar silinmez. Tamponları silmek için \ bd'ye basın.

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

[Düzenle] Aynı: bufdo (Luc Hermitte tarafından talep edildiği gibi, aşağıdaki yoruma bakın)

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
:bufdoMevcut pencereyi karıştırmasından hoşlanmıyorum .
Luc Hermitte

3

Benim de bu işlevselliğe her zaman ihtiyacım vardı. Vimrc'imde sahip olduğum çözüm bu.

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

Şimdi sadece yapabilirim :BW regex(örneğin:BW \.cpp$ ve yol adlarında bu kalıba uyan tüm eşleşen tamponları silebilirim.

Silmek yerine silmek isterseniz, elbette exec 'bw ' . join(l:matchList, ' ')şununla değiştirebilirsiniz:exec 'bd ' . join(l:matchList, ' ')


Vim her yerde (normal ifadeleri desteklemez neden Bazen merak :badd, :bdelete, :bufdo, :bn...)
puk

1

Çok basit: :bd[elete]komutu kullanın. Örneğin, :bd[elete] buf#1 buf#5 buf#31, 3 ve 5 arabelleklerini silecektir.


1

TABSadece Vim 7.4.282 itibariyle sizin için bir dosya otomatik olarak tamamlar
kullanım <c-a>tüm dosyaları otomatik olarak tamamlanması için.

Sadece kullanabilirsiniz:

bd filetype

daha sonra <c-a>belirtilen dosya türündeki tüm açık dosyaların tamamlanmasını kolaylaştırmak için kullanın .

örneğin, 1.xml, 2.xml, 3.xml ve 4.xml’ye sahipseniz şunları yapabilirsiniz:

bd xml

sonra basın <c-a>

vim sizin için şu şekilde otomatik tamamlayacaktır:

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

Komutu tamamlamak için sadece enter tuşuna basabilirsiniz.

Yukarıda belirtilen dosyalardan birinde değişiklik yaptıysanız şunları yapmayı unutmayın:

bd! xml
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.