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

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

감사.



답변

Vim 위키 에는이를위한 스크립트가 있습니다 . 나는 당신이 원하는 것을 수행하는 내장이 있다고 생각하지 않습니다.

VIM-bufkill의 최신 버전은 GitHub의에 있습니다 .


답변

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

: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( \리더 키인 경우)


답변

나는 오늘 이것을 검색했고

:b#|bd#

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

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

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

:windo b#

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


답변

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


답변

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

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


답변

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


답변

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

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