Vim에서 여러 버퍼를 삭제하는 방법은 무엇입니까?


120

Vim에서 여러 파일이 버퍼로 열려 있다고 가정합니다. 파일은이 *.cpp, *.h그리고 일부입니다 *.xml. 모든 XML 파일을 :bd *.xml. 그러나 Vim은이를 허용하지 않습니다 (E93 : 둘 이상의 일치 ...).

이렇게 할 수있는 방법이 있습니까?

추신 나는 그것이 :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>모든 일치 항목을 한 번에 추가 할 수 있습니다.
Björn Steinbrink 2013

세상에 당신 말이 맞아요! 죄송합니다. 탭은 가능한 결과가 하나만있을 때만 작동합니다.
Florian Klein

tmux에서 vim과 함께 <Ca>를 어떻게 사용합니까?
nabn

4
tmux는 기본적으로 <Ca>를 바인딩하지 않지만 예를 들어 화면을 에뮬레이트하기 위해 <Cb> 대신 <Ca>를 사용하도록 구성한 경우 매핑하도록 구성해야합니다 (예 : <Ca> a를 사용하여 < Ca>를 통해 tmux 내부에서 실행되는 프로그램으로 이동합니다. tmux와 함께 제공되는 screen-keys.conf가이를 수행합니다.
Björn Steinbrink 2015 년

7
JFTR을 vim-rsi설치 한 경우 (* nix의 모든 사용자에게 필수 항목이라고 생각합니다) <C-a>명령 줄에서 원래 방식으로 작업을 수행하려면 <C-x> <C-a>대신 사용해야 합니다.
kostix

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를 : 번호 버퍼 확인하고 A, BBD을 수 A로부터 삭제 버퍼 B에
Neaţu 인 Ovidiu 가브리엘

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

fnameescape()버퍼 이름을 잊어 버렸습니다 .
ZyX

난 그냥 함께 확인했습니다 c:/Program files/foo.bar, 심지어 foo.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

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


정력 사방 (정규 표현식을 지원하지 않는 이유 가끔 궁금해 :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>하는 파일 하나만 자동 완성됩니다 .

다음을 사용할 수 있습니다.

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.