Как удалить несколько буферов в Vim? - PullRequest
102 голосов
/ 01 июля 2010

При условии, что у меня есть несколько файлов, открытых как буферы в Vim.Файлы имеют *.cpp, *.h, а некоторые *.xml.Я хочу закрыть все файлы XML с помощью :bd *.xml.Однако Vim не позволяет этого (E93: более одного совпадения ...).

Есть ли способ сделать это?

PS Я знаю, что :bd file1 file2 file3 работает.Так можно ли как-нибудь оценить *.xml до file1.xml file2.xml file3.xml?

Ответы [ 8 ]

159 голосов
/ 29 февраля 2012

Вы можете использовать <C-a> для завершения всех матчей.Поэтому, если вы наберете :bd *.xml, а затем нажмете <C-a>, vim выполнит команду до :bd file1.xml file2.xml file3.xml.

27 голосов
/ 04 января 2017
:3,5bd[elete]   

Удалит диапазон буфера от 3 до 5.

14 голосов
/ 19 января 2016

Вы также можете использовать альтернативно:

    :.,$-bd[elete]    " to delete buffers from the current one to last but one
    :%bd[elete]       " to delete all buffers
5 голосов
/ 01 июля 2010

Попробуйте скрипт ниже. Пример для «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 (по запросу Люка Эрмитта, см. Комментарий ниже)

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 голосов
/ 01 июля 2010

Вы можете использовать это.

: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>)
3 голосов
/ 02 февраля 2011

Мне тоже все время нужна была эта функциональность. Это решение, которое у меня есть в моем 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, ' ')

1 голос
/ 19 октября 2014

Очень просто: используйте команду :bd[elete]. Например, :bd[elete] buf#1 buf#5 buf#3 удалит буферы 1, 3 и 5.

0 голосов
/ 16 мая 2016

TAB выполнит автозаполнение только одного файла для вас, начиная с Vim 7.4.282
, используйте <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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...