답변:
vim.org에서이 스크립트를 사용할 수 있습니다.
http://www.vim.org/scripts/script.php?script_id=1071
.vim/plugin디렉토리에 넣고 :BufOnly명령을 사용 하여 활성 버퍼를 제외한 모든 버퍼를 닫으십시오. 당신은 또한 당신이 좋아하는 다른 곳에 그것을 매핑 할 수 있습니다 .vimrc.
Github의 소스 (vim-scripts 미러를 통해) : https://github.com/vim-scripts/BufOnly.vim/blob/master/plugin/BufOnly.vim
이 시도
bufdo bd
bufdo는 모든 버퍼에 대한 명령을 실행합니다
bd명령을 실행 하기 전에 NERDTree를 닫아서 명령이 vim 자체를 닫지 않도록 할 수 있습니다. nnoremap <silent> <leader>c :NERDTreeClose<bar>bufdo bd<CR>.
나는 이것을 이렇게 쉽게 할 수 있었다.
:%bd|e#
:%bd|e#
%bd= 모든 버퍼를 삭제하십시오. e#= 편집 할 마지막 버퍼를 엽니 다. 사이의 파이프는 단지 하나의 명령을 수행합니다.
%bd|e#|bd#를 삭제하는 데 사용할 수 있습니다 [No Name].
command! BufOnly silent! execute "%bd|e#|bd#"
|:map <leader>o :%bd\|e#<cr>
현재의 것을 신경 쓰지 않으면 (스크립트가 필요없는) 다음과 같이하는 것이 더 간단합니다.
1,100bd
nnoremap <leader>bd :%bd | NERDTree<cr>
E16: Invalid range범위의 일부 버퍼가 실제로 존재하지 않기 때문에 얻을 수 있습니다. 최근까지는이를 무시하고있었습니다.
:ls실제로 열려있는 가장 큰 버퍼를 확인 하고 범위를 설정하십시오 (예 : 가장 높은 버퍼가 22 인 경우 :1,22bd). 내가 할 때까지 같은 오류가 발생했습니다.
나는 이것을한다
:w | %bd | e#
현재 버퍼를 열고 다른 모든 버퍼를 닫으려면 가장 좋아합니다.
작동 방식 : 먼저 현재 버퍼의 변경 사항을 작성한 다음 열려있는 모든 버퍼를 닫은 다음 현재 켜져있는 버퍼를 다시여십시오. Vim에서는 |명령 실행을 연결합니다. 버퍼가 최신이면 위의 내용을 단축 할 수 있습니다.:%bd | e#
%모든 선택기로 작동하지 않을 수도 있습니다. 당신은 아무것도 추측 할 수 있습니까?
bufnr("$")마지막 버퍼 번호를 반환하는 내장 함수 를 찾았습니다 . 그러나 이와 같이 사용할 때 문자열에 보간 할 생각은 없습니다 :1,bufnr("$")bd. 아마도 .. 가장 좋은 해결책은입니다 :1,9999bd.
:help :bd보여줍니다 :%bdelete " delete all buffers. 그래서 %당신이 원하는 것을 정확히이다. 나는 당신의 해결책의 변형을 사용합니다 : :%bd<CR><C-O>:bd#<CR>이것은 모든 버퍼를 삭제 한 다음 <C-O>현재 파일의 위치를 복원 :bd#하고 unamed 버퍼를 제거하는 데 사용합니다. 그러면 모든 버퍼가 닫히고 파일에서 같은 위치에있게됩니다.
juananruiz의 답변을 바탕으로합니다.
유지하려는 버퍼를 약간 변경 한 다음
:1,1000bd
명령 bd(버퍼 삭제)은 변경 사항을 저장하지 않은 버퍼를 삭제하지 않습니다. 이렇게하면 현재 (변경된) 파일을 버퍼 목록에 유지할 수 있습니다.
편집 : NERDTreeBuffer도 삭제됩니다. 당신은 그것을 다시 얻을 수 있습니다 : NERDTree
set nohidden설정 에 의존합니까 ?
모든 열린 버퍼를 닫는 중 :
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>
:%bd|e#|bd#
nmap <Leader>\c :call CloseAllBuffersButCurrent()<CR>:NERDTree<CR>
정확히이 작업을 수행 하는 플러그인 이 있습니다.
close-buffers.vim을 확인하십시오
여기 내가하는 일이 있습니다. 따라서 모든 버퍼를 제거한 후 커서 위치를 유지하고 싶습니다. 위의 대부분의 솔루션은이 사실을 무시합니다. 또한 명령을 다시 매핑하는 것이 입력하는 것보다 낫다고 생각하므로 <leader>bd모든 버퍼를 제거하고 원래 커서 위치로 되돌아갑니다.
noremap <leader>bd :%bd\|e#\|bd#<cr>\|'"
%bd = 모든 버퍼를 삭제합니다.
e# = 편집 할 마지막 버퍼를 엽니 다 (현재 작업중인 버퍼는 무엇입니까).
bd#를 사용할 때 생성되는 [No Name] 버퍼를 삭제합니다 %bd.
사이의 파이프는 단지 하나의 명령을 수행합니다. 사용하고 있지만 탈출해야합니다.\|
'" = 커서 위치를 유지하십시오.
내가 좋아하는 1,100bd( juananruiz에 의해 제안 나를 위해 작동하는 것 같다된다).
quit!내 매핑에 추가하여
nnoremap <leader>bd :1,100bd<CR>
nnoremap <leader>bdq :1,100bd<CR>:q!<CR>
이것은 모든 버퍼를 죽이고 Vim을 종료합니다.
bdq모든 버퍼를 닫고 vim을 종료 하는 매핑을 사용할 이유가 없습니다 . 내가 뭔가를 간과하지 않는 한:q!:qa!