Respostas:
Você pode usar este script em vim.org:
http://www.vim.org/scripts/script.php?script_id=1071
Basta colocá-lo no seu .vim/plugin
diretório e, em seguida, use o :BufOnly
comando para fechar todos os buffers, exceto o ativo. Você também pode mapeá-lo em qualquer lugar que desejar.vimrc
.
Fonte no Github (via espelho vim-scripts): https://github.com/vim-scripts/BufOnly.vim/blob/master/plugin/BufOnly.vim
Tente isto
bufdo bd
O bufdo executa o comando para todos os buffers
bd
comando feche o próprio vim; nnoremap <silent> <leader>c :NERDTreeClose<bar>bufdo bd<CR>
.
Eu era capaz de fazer isso facilmente assim:
:%bd|e#
:%bd|e#
%bd
= exclui todos os buffers. e#
= abre o último buffer para edição. O canal entre eles apenas executa um comando após o outro.
%bd|e#|bd#
para excluir o [No Name]
buffer criado.
command! BufOnly silent! execute "%bd|e#|bd#"
|
:map <leader>o :%bd\|e#<cr>
Se você não se importa com o atual, é mais simples fazer algo como (nenhum script precisa):
1,100bd
nnoremap <leader>bd :%bd | NERDTree<cr>
E16: Invalid range
porque alguns dos buffers no intervalo não existem realmente. Foi ignorando isso até recentemente.
:ls
para ver o maior buffer que você realmente abriu e defina seu intervalo para isso (por exemplo, se o seu buffer mais alto for 22, então :1,22bd
). Eu recebi o mesmo erro até fazer isso.
Eu faço isso
:w | %bd | e#
Meu favorito se eu apenas quero que meu buffer atual abra e feche todos os outros.
Como funciona: primeiro escreva as alterações do buffer atual, feche todos os buffers abertos e reabra o buffer em que eu estava atualmente. No Vim, as |
cadeias executam os comandos juntos. Se o seu buffer estiver atualizado, o acima pode ser reduzido para:%bd | e#
%
não pode funcionar como todos os seletores. Você poderia adivinhar alguma coisa?
bufnr("$")
interna que retorna o último número do buffer. mas não faço ideia de interpolar para string quando uso assim :1,bufnr("$")bd
. Talvez ... a melhor solução seria :1,9999bd
.
:help :bd
mostra :%bdelete " delete all buffers
. Então %
é exatamente o que você quer. Eu uso uma variante da sua solução: :%bd<CR><C-O>:bd#<CR>
Isso excluirá todos os buffers e, em seguida, será usado <C-O>
para restaurar a posição no arquivo atual e :bd#
remover o buffer não nomeado. Isso fecha todos os buffers e deixa você no mesmo local no arquivo.
Aproveitando a resposta de juananruiz.
Faça uma pequena alteração no buffer que deseja manter e, em seguida,
:1,1000bd
O comando bd
(exclusão do buffer) não excluirá nenhum buffer com alterações não salvas. Dessa forma, você pode manter o arquivo atual (alterado) na lista de buffers.
Editar: Observe que isso também excluirá seu NERDTreeBuffer. Você pode recuperá-lo com: NERDTree
set nohidden
de ser definido?
Usando
:on[ly][!]
e
:h only
Fechando todos os buffers abertos:
silent! execute "1,".bufnr("$")."bd"
Fechando todos os buffers abertos, exceto o atual :
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
Adicione esta função .vimrc
e chame-a usando :call CloseAllBuffersButCurrent()
.
Mapa de conveniência:
nmap <Leader>\c :call CloseAllBuffersButCurrent()<CR>
:%bd|e#|bd#
nmap <Leader>\c :call CloseAllBuffersButCurrent()<CR>:NERDTree<CR>
Coloquei isso no meu arquivo .vimrc
nnoremap <leader>ca :w <bar> %bd <bar> e# <bar> bd# <CR>
então seu leader + ca
(fechar todos) fecha todos os buffers, exceto o atual.
O que faz é
: w - salva o buffer atual
% bd - fecha todos os buffers
e # - abre o último arquivo editado
bd # - fecha o buffer sem nome
Existe um plugin que faz exatamente isso e um pouco mais!
Confira close-buffers.vim
Aqui está o que eu faço. Por isso, gosto de manter a posição do cursor após remover todos os buffers e a maioria das soluções acima ignora esse fato. Eu também acho que remapear o comando é melhor do que digitá-lo, então aqui eu uso <leader>bd
para remover todos os buffers e voltar à minha posição original do cursor.
noremap <leader>bd :%bd\|e#\|bd#<cr>\|'"
%bd
= excluir todos os buffers.
e#
= abre o último buffer para edição (qual é o buffer em que estou trabalhando).
bd#
para excluir o buffer [No Name] criado quando você usa %bd
.
O canal entre eles apenas executa um comando após o outro. Você tem que escapar embora usando\|
'"
= mantenha minha posição do cursor.
Eu gosto 1,100bd
( sugerido por juananruiz ) que parece funcionar para mim.
Adicionei um quit!
ao meu mapeamento para me dar
nnoremap <leader>bd :1,100bd<CR>
nnoremap <leader>bdq :1,100bd<CR>:q!<CR>
Isso mata todos os buffers e desliga o Vim, que é o que eu estava procurando principalmente.
bdq
mapeamento que fecha todos os buffers e sai do vim :q!
, quando você pode apenas usar :qa!
. A menos que eu estou com vista algo
Que tal apenas:
ctrl-w o
(obrigado a https://thoughtbot.com/blog/vim-splits-move-faster-and-more-naturally )