Vim : 모든 버퍼를 닫으십시오.


198

Vim에서 현재 편집중인 버퍼를 제외한 모든 버퍼를 닫으려면 어떻게해야합니까?


1
나는 세례반 이 링크
klokop

답변:



171

이 시도

bufdo bd

bufdo는 모든 버퍼에 대한 명령을 실행합니다

http://vim.wikia.com/wiki/Run_a_command_in_multiple_buffers


NERDTree 버퍼는 닫히지 않습니다.
Uri

2
bd명령을 실행 하기 전에 NERDTree를 닫아서 명령이 vim 자체를 닫지 않도록 할 수 있습니다. nnoremap <silent> <leader>c :NERDTreeClose<bar>bufdo bd<CR>.
lvarayut

11
이 문서는 :bufdo'버퍼를 삭제하거나 버퍼 목록에 버퍼를 추가해서는 안된다'는 주장에 대해 경고합니다 . 따라서이 솔루션이 작동하면 우연히 작동하며 ... 나에게 효과적이지 않습니다 (다른 버퍼로 전환).
glts

10
이것은 나를 위해 모든 버퍼를 닫습니다. 이것은 질문이 아닙니다. (MacVim 버전 8.0.1207)
Michael Leonard

1
이 명령은 모든 버퍼를 닫습니다. 현재 제품을 어떻게 열어 둘 수 있습니까?
h-rai

145

나는 이것을 이렇게 쉽게 할 수 있었다.

:%bd|e#

4
이것은 좋은 대답입니다. BufOnly의 인수 전달 기능을 사용하지 않는 한 BufOnly가 약간 과도하게 느껴집니다 (전체 플러그인입니까?). 내가 정말로하고 싶은 것은:%bd|e#
shmup

42
@jorgeh %bd= 모든 버퍼를 삭제하십시오. e#= 편집 할 마지막 버퍼를 엽니 다. 사이의 파이프는 단지 하나의 명령을 수행합니다.
OldTimeGuitarGuy

20
@Jared 생성 된 버퍼 %bd|e#|bd#를 삭제하는 데 사용할 수 있습니다 [No Name].
kshenoy

12
훌륭한. 그런 다음 BufOnly 플러그인을 사용한 유일한 방법은 다음과 같습니다.command! BufOnly silent! execute "%bd|e#|bd#"
shmup

4
@Finn 당신은 탈출해야합니다 |:map <leader>o :%bd\|e#<cr>
Halil Özgür

57

현재의 것을 신경 쓰지 않으면 (스크립트가 필요없는) 다음과 같이하는 것이 더 간단합니다.

1,100bd

4
nerdtree 버퍼도 닫습니다.
Afshin Mehrabani

NERDTree가 활성화되어있을 때이 명령을 사용하는 데 문제가있었습니다. @VoY에서 언급했듯이 BufOnly.vim 플러그인을 사용하는 것이 좋습니다.
moeabdol 2016 년

1
NERDTree 버퍼 삭제를 설명하는 다음 매핑을 만들었습니다.nnoremap <leader>bd :%bd | NERDTree<cr>
Uri

5
나는 이것을 오랫동안 사용했지만 이제는 E16: Invalid range범위의 일부 버퍼가 실제로 존재하지 않기 때문에 얻을 수 있습니다. 최근까지는이를 무시하고있었습니다.
Jon

3
@Jon :ls실제로 열려있는 가장 큰 버퍼를 확인 하고 범위를 설정하십시오 (예 : 가장 높은 버퍼가 22 인 경우 :1,22bd). 내가 할 때까지 같은 오류가 발생했습니다.
Nairou

51

나는 이것을한다

:w | %bd | e#

현재 버퍼를 열고 다른 모든 버퍼를 닫으려면 가장 좋아합니다.

작동 방식 : 먼저 현재 버퍼의 변경 사항을 작성한 다음 열려있는 모든 버퍼를 닫은 다음 현재 켜져있는 버퍼를 다시여십시오. Vim에서는 |명령 실행을 연결합니다. 버퍼가 최신이면 위의 내용을 단축 할 수 있습니다.:%bd | e#


대부분 잘 작동합니다. 그러나 때로는 %모든 선택기로 작동하지 않을 수도 있습니다. 당신은 아무것도 추측 할 수 있습니까?
Jin Jin Kim

@JinyoungKim ([1]부터) ": % bd"명령에서 '%'범위는 현재 버퍼의 시작 및 끝 줄 번호로 바뀝니다. 범위로 '%'를 사용하는 대신 범위에 숫자를 지정해야합니다. 예를 들어, 모든 버퍼를 삭제하려면 ": 1,9999bd"[1] vimdoc.sourceforge.net/cgi-bin/vimfaq2html3.pl#8.8
iamnotsam

방금 문서를 확인했습니다. 그렇다면 '%'범위는 많은 현재 파일 행에 의존합니까?
Kim Jinyoung

2
bufnr("$")마지막 버퍼 번호를 반환하는 내장 함수 를 찾았습니다 . 그러나 이와 같이 사용할 때 문자열에 보간 할 생각은 없습니다 :1,bufnr("$")bd. 아마도 .. 가장 좋은 해결책은입니다 :1,9999bd.
Jin Jin Kim

2
:help :bd보여줍니다 :%bdelete " delete all buffers. 그래서 %당신이 원하는 것을 정확히이다. 나는 당신의 해결책의 변형을 사용합니다 : :%bd<CR><C-O>:bd#<CR>이것은 모든 버퍼를 삭제 한 다음 <C-O>현재 파일의 위치를 ​​복원 :bd#하고 unamed 버퍼를 제거하는 데 사용합니다. 그러면 모든 버퍼가 닫히고 파일에서 같은 위치에있게됩니다.
Alejandro

26

juananruiz의 답변을 바탕으로합니다.

유지하려는 버퍼를 약간 변경 한 다음

:1,1000bd

명령 bd(버퍼 삭제)은 변경 사항을 저장하지 않은 버퍼를 삭제하지 않습니다. 이렇게하면 현재 (변경된) 파일을 버퍼 목록에 유지할 수 있습니다.

편집 : NERDTreeBuffer도 삭제됩니다. 당신은 그것을 다시 얻을 수 있습니다 : NERDTree


완벽하고 짧고 간단합니다! :)
arkod

50
: % bd는 실제로 1-1000 대신 "all"입니다.
John Tyree

이것이 set nohidden설정 에 의존합니까 ?
Felipe Alvarez

15

사용하여

:on[ly][!]

:h only

29
버퍼가 아닌 창을 닫습니다.
ZyX

13
사람들이 잘못된 용어로 인터넷 검색을 잘 할 수 있으므로 여전히 유용합니다. 둘 다 고마워요 :)
archgoon

1
@archgoon 네,하지만 대답에 지정해야합니다.
andho

10

모든 열린 버퍼를 닫는 중 :

silent! execute "1,".bufnr("$")."bd"

열려있는 모든 버퍼를 닫기 현재의 제외 :

function! CloseAllBuffersButCurrent()
  let curr = bufnr("%")
  let last = bufnr("$")

  if curr > 1    | silent! execute "1,".(curr-1)."bd"     | endif
  if curr < last | silent! execute (curr+1).",".last."bd" | endif
endfunction

이 함수를에 추가하고을 .vimrc사용하여 호출하십시오 :call CloseAllBuffersButCurrent().

편의지도 :

nmap <Leader>\c :call CloseAllBuffersButCurrent()<CR>

버퍼를 복원하는 vim 세션을 재개 할 때 위의 내용을 사용하여 더 이상 버퍼를 제거 할 수 없었습니다. 대신, 나는:%bd|e#|bd#
shmup

최고의 솔루션. nmap <Leader>\c :call CloseAllBuffersButCurrent()<CR>:NERDTree<CR>
Gjaa

6

나는 이것을 .vimrc 파일에 넣었다.

nnoremap <leader>ca :w <bar> %bd <bar> e# <bar> bd# <CR>

그런 다음 leader + ca현재 버퍼를 제외한 모든 버퍼를 닫으십시오.

그것이하는 일은

: w-현재 버퍼 저장

% bd-모든 버퍼를 닫습니다

e #-마지막으로 편집 한 파일 열기

bd #-명명되지 않은 버퍼를 닫습니다



1

여기 내가하는 일이 있습니다. 따라서 모든 버퍼를 제거한 후 커서 위치를 유지하고 싶습니다. 위의 대부분의 솔루션은이 사실을 무시합니다. 또한 명령을 다시 매핑하는 것이 입력하는 것보다 낫다고 생각하므로 <leader>bd모든 버퍼를 제거하고 원래 커서 위치로 되돌아갑니다.

noremap <leader>bd :%bd\|e#\|bd#<cr>\|'"

%bd = 모든 버퍼를 삭제합니다.

e# = 편집 할 마지막 버퍼를 엽니 다 (현재 작업중인 버퍼는 무엇입니까).

bd#를 사용할 때 생성되는 [No Name] 버퍼를 삭제합니다 %bd.

사이의 파이프는 단지 하나의 명령을 수행합니다. 사용하고 있지만 탈출해야합니다.\|

'" = 커서 위치를 유지하십시오.


0

내가 좋아하는 1,100bd( juananruiz에 의해 제안 나를 위해 작동하는 것 같다된다).

quit!내 매핑에 추가하여

nnoremap <leader>bd :1,100bd<CR>
nnoremap <leader>bdq :1,100bd<CR>:q!<CR>

이것은 모든 버퍼를 죽이고 Vim을 종료합니다.


1
대신 bdq모든 버퍼를 닫고 vim을 종료 하는 매핑을 사용할 이유가 없습니다 . 내가 뭔가를 간과하지 않는 한:q!:qa!
shmup

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.