창을 닫지 않고 어떻게 버퍼를 닫을 수 있습니까?


120

Vim의 다중 레이어 뷰 (Windows, Buffers 및 Tabs)는 약간 혼란 스러웠습니다. 디스플레이 (: sp)를 분할 한 다음 각 창에 표시 할 다른 버퍼를 선택한다고 가정 해 보겠습니다. 이제 버퍼 중 하나를 닫고 싶지만 창을 닫고 싶지 않습니다 (닫은 후에는 목록에 다음 버퍼를 표시하거나 빈 버퍼를 표시 할 수 있지만 중요하지 않습니다). 어떻게 할 수 있습니까?

감사.


버퍼를 더 이상 보지 않고 닫고 싶은 이유 가 있습니까?
rampion

9
나는 이것에 대해서도 실제로 궁금해하고 있습니다. 버퍼를 삭제하고 프로세스에서 내 분할의 일부가 파괴 된 부분을 나중에 다시 빌드해야하는 것은 성가신 일입니다.
brettkelly

3
지금까지 29 표. 나는 이것이 매우 일반적인 사용 사례라고 생각합니다. 많은 버퍼로 작업 할 때 필요합니다. 때로는 두 개의 창을 사용하고 버퍼를 닫고 싶습니다. 그 창문이 사라지는 것을 원하지 않습니다. 다음 버퍼가 표시되기를 원합니다.
Wilson Freitas 2014 년


답변:



145

나는 이것을 조금 엉망으로 만들었고 마침내 다음과 같이 생각해 냈습니다.

:bp | sp | bn | bd

키 매핑을위한 복사 / 붙여 넣기 버전은 다음과 같습니다.

:bp<bar>sp<bar>bn<bar>bd<CR>

나는 그것을 공정하게 테스트했으며 다양한 조건에서 일관되게 작동합니다. 마지막 버퍼에서 사용하면 새로운 빈 버퍼가 남게됩니다.

.vimrc에 이것을 던져라 :

map <leader>q :bp<bar>sp<bar>bn<bar>bd<CR>

Vim을 다시 시작하거나 :source ~/.vimrc변경 사항을 적용하십시오. 다음에 버퍼를 닫으려면 다음을 입력하십시오. \q( \리더 키인 경우)


1
감사합니다! 내가 본 다른 모든 솔루션과 달리 멋지고 간단합니다.
jwd

16
초보자의 경우 .vimrc : map <leader>q :bp<bar>sp<bar>bn<bar>bd<CR>. VIM을 다시 시작하고 다음에 버퍼를 닫으려면 다음을 입력하십시오.\q
EasyCo

5
창을 세로로 분할 한 경우 예기치 않은 결과가 발생합니다. 실제로 표준 (에서 생성 sp) 이외의 모든 창 분할 구성 입니다.
hitzg

2
.vimrc에 넣을 스 니펫에 마침표가 포함되지 않아야한다고 생각합니다. 그 외에는 굉장합니다! 이것은 받아 들여진 대답이어야합니다.
Ernesto

3
이것은 우아합니다. 다른 사람이 말한대로 대부분 수직 분할을 사용하는 경우, 전환 sp과 함께 vsp. 이처럼 내의 .vimrc 입력 외모 :cnoremap bd bp<bar>vsp<bar>bn<bar>bd
코너

38

나는 오늘 이것을 검색했고

:b#|bd#

현재 창을 이전에 열린 버퍼로 변경하고 방금 전환 한 버퍼를 삭제 / 숨 깁니다.

이를 위해서는 최소한 두 개의 알려진 버퍼가 필요합니다.

다른 창이지만 현재가 동일한 버퍼를 표시하면 여전히 분할을 파괴합니다. 모든 창을 이전에 열린 버퍼로 변경할 수 있습니다.

:windo b#

비슷한 질문 에 대한 답변으로 매핑 (및 일부 함정)을 논의하는 이전 명령에 대한 자세한 내용을 추가했습니다 .


또한 이것은 할 수 있습니다 ... :#b|#bd위의 버퍼 명령과 버퍼 번호를 바꾸면됩니다.
Ashish

나는 이것을 조금 사용했지만 이전에 닫힌 버퍼를 다시 열었다는 사실에 계속 짜증이났습니다.
pean

@pean 링크 된 답변에서 언급 한 것입니다- "중요 사항"을 참조하십시오. 예, 이것이 다른 오픈 버퍼로 전환되면 더 좋을 것입니다.
유효한

1
:bn|bd#또는 :bp|bd#가장 최근에 액세스 한 버퍼 (b #) 대신 각각 이전 또는 다음 열린 버퍼로 전환 할 수도 있습니다 .
pavon

12
nmap <leader>d :bprevious<CR>:bdelete #<CR>

하나의 버퍼가 여러 창에서 열릴 때까지 정상적으로 작동합니다. 더 큰 스크립트를 사용하지 않는 한 충분합니다.

편집 : 이것은 내가 지금 사용하는 것입니다.

function! BufferDelete()
    if &modified
        echohl ErrorMsg
        echomsg "No write since last change. Not closing buffer."
        echohl NONE
    else
        let s:total_nr_buffers = len(filter(range(1, bufnr('$')), 'buflisted(v:val)'))

        if s:total_nr_buffers == 1
            bdelete
            echo "Buffer deleted. Created new buffer."
        else
            bprevious
            bdelete #
            echo "Buffer deleted."
        endif
    endif
endfunction

1
이 방법을 시도했지만 여러 분할 창을 사용하는 동안 잘 작동하지 않았습니다. 누군가 같은 문제가있는 경우 내 해결책은 다음과 같습니다.nmap <leader>d :ene<CR>:bd #<CR>
caio

7

나는 이것이 당신이 찾고있는 것 같아요

http://www.vim.org/htmldoc/windows.html#window-moving

이 시도:

사용하여 버퍼 ID를 살펴보십시오.

:buffers

거기에 버퍼 목록이 표시됩니다.

1  a.cpp
2  b.py
3  c.php

버퍼에서 b.py를 제거하려면

:2bw

버퍼에서 모두 제거 / 닫으려면

:1,3bw

1
나는 창문을 옮기고 싶지 않다. 창의 위치, 크기 또는 존재를 건드리지 않고 버퍼를 닫고 싶습니다.
Mosh

5

NERDTree를 사용하는 사람들을 위해.

이 플러그인 https://github.com/jistr/vim-nerdtree-tabs를 사용하여이 문제를 해결 하고 이제 창을 닫지 않고 유일한 buff / file / tab을 닫을 수 있습니다.

위의 플러그인을 설치 한 후 .vimrc에 다음 코드를 넣으십시오.

let g:nerdtree_tabs_autoclose=0

위의 변수에 대한 설명은 다음과 같습니다. 창이 하나만 있고 NERDTree (기본값 1) 인 경우 현재 탭을 닫습니다.

자세한 정보 : https://github.com/jistr/vim-nerdtree-tabs#configuration


2

나는이 작업을 수행 할 수있는 하나의 샷 방법이라고 생각하지 않습니다,하지만 당신은 할 수 :enew또는 :ls사용하여 다른 하나에 버퍼 스왑을 나열합니다 :b [number].

창에 다른 버퍼가 있으면 창 :bd #에서 이전 버퍼를 삭제하고 현재 버퍼가 여전히 존재하기 때문에 창이 닫히지 않습니다.


2

나는 사용했다 :

:bp<bar>sp<bar>bn<bar>bd<CR>

그러나 나는 그것이 내 창문을 닫는 특정 경우를 발견했습니다.

최근에 저는 프로젝트 작업을 할 때 항상 이것을 사용하고 작업으로 .tmux.conf .zshrc돌아 가기 전에 빨리 열어야한다는 것을 알게 되었습니다.

이 사용법의 경우 다음이 더 좋습니다.

  • 이전에 작업했던 버퍼로 다시 전환하십시오. C-6
  • 입력 :bd#이전 버퍼를 삭제 (I이처럼 매핑 한 : nnoremap <leader>d :bd#<CR>)

다시 돌아가는 버퍼를 제어 할 수 있고 더 자연스럽게 느껴집니다.


1

할 것이다

:enew

원하는 걸 해? 현재 창에서 이름이 지정되지 않은 새 버퍼를 편집하여 기존 파일을 다른 창에서 열어 둡니다.


새로운 빈 버퍼가 열립니다. 창을 닫지 않고 현재 버퍼를 닫고 싶습니다.
Mosh

1

제가 가장 좋아하는 솔루션은 bufkill.vim 플러그인 ( GitHub )입니다. :b해당 명령과 동일하게 작동하지만 창을 열어 두는 다양한 -prefix 명령 의 대체 버전을 제공합니다 . 마지막으로 보이는 버퍼가 포함되어 있거나 이전 버퍼가없는 경우 비어있는 / 새 버퍼를 표시합니다.

문서에서 :

버퍼를 언로드 / 삭제 / 삭제하려면 다음을 사용하십시오.
  : bun / : bd / : bw 창을 닫습니다 (vim 명령).
  : BUN / : BD / : BW-창을 그대로 둡니다 (이 스크립트).

1

보기를 '닫으려면'을 사용하십시오 :hid[e]. 뷰포트를 분할하거나 여러 파일을 열었을 때 작동합니다. 디스플레이에서 마지막 버퍼를 숨길 수 없습니다.

1 도움이 된 추가 팁 : :e ./path/to/file.work창을 분할하지 않고 뷰포트에서 파일을 여는 데 사용 합니다.

PS Vim에 들어간 이틀 동안 정확한 도움말 명령을 찾는 데 여전히 어려움이 있습니다. 바라건대 이것은 다른 누군가가 vim을 이해할 시간을 가질 때까지 계속 작업하는 데 도움이되기를 바랍니다.


1

다음은 모든 경우를 잘 처리하는 매우 읽기 쉬운 vimscript 함수입니다 .

  • 내장과 유사하게 작동합니다 :bd(창이 하나뿐이면 호출 만하면됩니다!).
    • 경고를 발행하고 버퍼가 수정 된 경우 아무 작업도 수행하지 않습니다.
    • 다른 버퍼가 없으면 :enew.
    • 대체 버퍼가 있고에있는 buffer-list경우 전환하고 그렇지 않으면을 통해 다음으로 이동 :bn합니다.
  • 다중 창 레이아웃에 대한보다 합리적인 동작
    • 창을 닫지 않고
    • 항상 원래 창에 머물러 있습니다.
    • 현재 버퍼를 표시하는 각 창에 대해 위에 나열된대로 수행 한 다음 이전 현재 버퍼를 삭제합니다.
nnoremap <Leader> b : DeleteCurBufferNotCloseWindow () <CR> 호출

func! DeleteCurBufferNotCloseWindow () 중단
    수정 된 경우
        echohl ErrorMsg
        echom "E89 : 마지막 변경 이후 쓰기 없음"
        echohl 없음
    elseif winnr ( '$') == 1
        bd
    else "여러 창
        let oldbuf = bufnr ( '%')
        let oldwin = winnr ()
        1 "동안 oldbuf를 표시하는 모든 창은 열린 상태로 유지됩니다.
            buflisted (bufnr ( '#')) 인 경우
                비#
            그밖에
                십억
                let curbuf = bufnr ( '%')
                curbuf == oldbuf 인 경우
                    enew "oldbuf는 유일한 버퍼입니다.
                endif
            endif
            let win = bufwinnr (oldbuf)
            이기면 == -1
                단절
            else "oldbuf를 표시하는 다른 창이 있습니다.
                임원 승 'wincmd w'
            endif
        끝까지
        "oldbuf를 삭제하고 창을 oldwin으로 복원
        exec oldbuf 'bd'
        exec oldwin 'wincmd w'
    endif
endfunc

0

당신이 저와 같고 여기에 반대의 일을 하려고 여기 왔으면 버퍼를 닫지 않고 창을 닫으십시오.

:close


0

개인적으로 사용하는 간단한 버전은

:bp|bd#

이전 버퍼로 이동하여 다른 버퍼 (실제로 우리가 점프 한 원본)를 삭제합니다. 이것은 복잡한 스크립트없이 99 %의 경우에서 기대할 수있는 작업을 수행합니다.

키보드 단축키로 다음을 사용합니다.

nnoremap <silent> <Leader>c :bp<BAR>bd#<CR>

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