Bagaimana cara menghapus beberapa buffer di Vim?

120

Dengan asumsi saya memiliki banyak file yang dibuka sebagai buffer di Vim. File-file tersebut memiliki *.cpp, *.hdan beberapa diantaranya *.xml. Saya ingin menutup semua file XML dengan :bd *.xml. Namun, Vim tidak mengizinkan ini (E93: Lebih dari satu pertandingan ...).

Apakah ada cara untuk melakukan ini?

PS Saya tahu itu :bd file1 file2 file3berhasil. Jadi, dapatkah saya mengevaluasi *.xmlke file1.xml file2.xml file3.xml?

Thanh DK
sumber

Jawaban:

194

Anda dapat menggunakan <C-a>untuk menyelesaikan semua pertandingan. Jadi jika Anda mengetik :bd *.xmldan menekan <C-a>, vim akan menyelesaikan perintah menjadi :bd file1.xml file2.xml file3.xml.

Björn Steinbrink
sumber
8
@Florian <tab>hanya memungkinkan Anda untuk menelusuri pertandingan, meletakkan satu entri pada baris perintah, <C-a>menambahkan semua pertandingan sekaligus.
Björn Steinbrink
Ya Tuhan, kamu benar! Maaf. tab hanya berfungsi jika hanya ada satu kemungkinan hasil.
Florian Klein
Bagaimana Anda menggunakan <Ci> dengan vim di tmux?
nabn
4
tmux tidak mengikat <Ci> secara default, tetapi jika Anda mengonfigurasikannya ke misalnya, gunakan <Ci> daripada <Cb> untuk meniru layar, Anda juga harus mengkonfigurasinya untuk memetakan, misalnya, <Ci> a untuk meneruskan < Ca> melalui program yang berjalan di dalam tmux. Screen-keys.conf yang disertakan dengan tmux melakukan itu.
Björn Steinbrink
7
JFTR, jika Anda telah vim-rsimenginstal (menurut saya, ini harus dimiliki oleh semua orang di * nix), untuk mendapatkan <C-a>pekerjaan dengan cara asli di baris perintah, Anda harus menggunakan <C-x> <C-a>sebagai gantinya.
kostix
43
:3,5bd[elete]   

Akan menghapus rentang buffer dari 3 hingga 5.

Nelayan
sumber
19

Anda juga dapat menggunakan alternatif menggunakan:

    :.,$-bd[elete]    " to delete buffers from the current one to last but one
    :%bd[elete]       " to delete all buffers
Cylian
sumber
1
Ini bekerja dengan baik. Saya melakukan : ls untuk melihat nomor buffer dan mereka : a, bbd untuk menghapus buffer dari nomor a ke b
Neaţu Ovidiu Gabriel
5

Anda bisa menggunakan ini.

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

Seharusnya cukup mudah menambahkannya ke perintah.

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>)
Luc Hermitte
sumber
Saya hampir tidak tahu apa-apa tentang Vimscript, tapi bagaimana dengan fungsi glob ()?
Thanh DK
1
glob()hanya akan memberi Anda file yang sudah ada (di hard drive Anda), dan tidak membuka buffer.
Luc Hermitte
Anda lupa fnameescape()nama buffer.
ZyX
Saya baru saja memeriksanya c:/Program files/foo.bar, dan bahkan foo.bar.foodan itu bekerja dengan sempurna. fnameescape()mungkin diperlukan jika saya menggunakan nama buffer. Tapi saya hanya memeriksa apakah nama buffer cocok dengan ekspresi yang diberikan: \.{ext}$- Saya memberikan nomor buffer ke: bd`. Saya tidak punya alasan untuk menghindari apa pun untuk pencocokan ekspresi reguler.
Luc Hermitte
5

Coba script di bawah ini. Contohnya adalah untuk "txt", ubah sesuai kebutuhan, misalnya menjadi "xml". Buffer yang dimodifikasi tidak dihapus. Tekan \ bd untuk menghapus buffer.

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

[Sunting] Sama tanpa: bufdo (seperti yang diminta oleh Luc Hermitte, lihat komentar di bawah)

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
Habi
sumber
1
Saya tidak suka :bufdokarena itu mengacaukan jendela saat ini.
Luc Hermitte
3

Saya juga membutuhkan fungsi ini sepanjang waktu. Ini adalah solusi yang saya miliki di vimrc saya.

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

Sekarang, saya bisa melakukannya :BW regex(misalnya :BW \.cpp$dan menghapus semua buffer yang cocok yang memiliki pola yang cocok di nama jalur mereka.

Jika Anda ingin menghapus daripada menghapus, tentu saja Anda bisa menggantinya exec 'bw ' . join(l:matchList, ' ')denganexec 'bd ' . join(l:matchList, ' ')

Kent
sumber
Saya kadang bertanya-tanya mengapa vim tidak mendukung ekspresi reguler di mana-mana ( :badd, :bdelete, :bufdo, :bn...)
puk
1

Sangat sederhana: gunakan :bd[elete]perintah. Misalnya, :bd[elete] buf#1 buf#5 buf#3akan menghapus buffer 1, 3, dan 5.

Harry
sumber
1

TABhanya akan otomatis melengkapi satu file untuk Anda pada Vim 7.4.282
digunakan <c-a>untuk melengkapi otomatis semua file.

Anda bisa menggunakan:

bd filetype

lalu gunakan saja <c-a>untuk memfasilitasi penyelesaian semua file terbuka dari jenis file yang ditentukan.

misalnya, Anda memiliki 1.xml, 2.xml, 3.xml, dan 4.xml, Anda dapat melakukan:

bd xml

lalu tekan <c-a>

vim akan melengkapi otomatis untuk Anda sebagai berikut:

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

Anda tinggal menekan enter untuk menyelesaikan perintah.

jika Anda telah membuat perubahan pada salah satu file yang disebutkan di atas, jangan lupa lakukan:

bd! xml
stucash
sumber