如何获取:bwipe * .ext擦除与vim中的通配符匹配的所有人

时间:2010-08-17 21:37:06

标签: vim

我经常要擦除所有加载了给定扩展名的缓冲区(通常是补丁生成的.rej文件)。只是这样做:如果有多个匹配,bw [!] * .rej会抱怨。有没有人有任何好的建议?目前我要么重复使用:bw * .rej + tab-complete,或者,如果有很多缓冲区,请使用:ls和:bw按数字组合一组缓冲区。

4 个答案:

答案 0 :(得分:1)

vim中的Globbing有点困难(除了文件系统上的文件)。因此,最好的方法似乎是将通配符转换为正则表达式,然后检查缓冲区列表中的每个缓冲区以查看它是否匹配。像这样:

" A command to make invocation easier
command! -complete=buffer -nargs=+ BWipe call BWipe(<f-args>)

function! BWipe(...)
    let bufnames = []
    " Get a list of all the buffers
    for bufnumber in range(0, bufnr('$'))
        if buflisted(bufnumber)
            call add(bufnames, bufname(bufnumber))
        endif
    endfor
    for argument in a:000
        " Escape any backslashes, dots or spaces in the argument
        let this_argument = escape(argument, '\ .')
        " Turn * into .* for a regular expression match
        let this_argument = substitute(this_argument, '\*', '.*', '')

        " Iterate through the buffers
        for buffername in bufnames
            " If they match the provided regex and the buffer still exists
            " delete the buffer
            if match(buffername, this_argument) != -1 && bufexists(buffername)
                exe 'bwipe' buffername
            endif
        endfor
    endfor
endfunction

可以用作:

:BWipe *.rej

或:

:BWipe *.c *.h

答案 1 :(得分:0)

顺便说一下,我最终选择了一种非常低技术的解决方案(我个人喜欢尽可能少地修改vim,这样我就可以在任何机器上使用了):

我添加了一个映射:

  

:map&lt; C-f&gt; :bw * .rej

然后我反复按 c为C-f是氟烃基; &LT;标签&gt; &LT; CR&GT;

答案 2 :(得分:0)

即将到来,但对我有用,有很多文件:

  1. :mksession!
  2. :q
  3. vi Session.vim a) 删除所有包含您不想要的文件的“badd”行 b) :wq
  4. vim -S Session.vim # 以您拥有的状态重新启动,但没有文件

答案 3 :(得分:0)

执行 CTRL-A 以在光标前插入模式的所有匹配项。见:help c_CTRL-A。例如,如果您加载了文件 a.rejb.rejc.rej,则执行

:bw *.rej<C-A>

会给你留下

:bw a.rej b.rej c.rej

然后您可以按 Enter 键擦除这些缓冲区。