Basta colocá-lo no seu .vim/plugindiretório e, em seguida, use o :BufOnlycomando para fechar todos os buffers, exceto o ativo. Você também pode mapeá-lo em qualquer lugar que desejar.vimrc .
NERDTree está fechado se o foco estiver no painel de árvore lerdo
gayavat
2
Você pode fechar o NERDTree antes de fazer isso para impedir que o bdcomando feche o próprio vim; nnoremap <silent> <leader>c :NERDTreeClose<bar>bufdo bd<CR>.
Lvarayut
11
A documentação avisa que o argumento para :bufdo'não deve excluir buffers ou adicionar buffers à lista de buffers'. Portanto, se essa solução funcionar, ela funciona por acidente ... e geralmente não funciona para mim (alterna para um buffer diferente).
MLDs
10
Isso fecha todos os buffers para mim, o que não é o que as perguntas fazem. (MacVim versão 8.0.1207)
Esta é uma boa resposta. Isso faz com que o BufOnly pareça um pouco exagerado (quero dizer, um plugin inteiro?), A menos que você esteja usando o recurso de passagem de argumentos do BufOnly. Tudo que eu quero realmente fazer é:%bd|e#
shmup
41
@jorgeh %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.
precisa saber é o seguinte
20
@Jared Você pode usar %bd|e#|bd#para excluir o [No Name]buffer criado.
kshenoy
12
Maravilhoso. Então aqui você tem a única coisa que eu já usei o plugin BufOnly para, destilada para um único comando:command! BufOnly silent! execute "%bd|e#|bd#"
Eu enfrentei alguns problemas ao usar este comando quando o NERDTree está ativado. Recomendo usar o plug-in BufOnly.vim, conforme mencionado por @VoY.
Moeabdol #
1
Fiz o seguinte mapeamento, que explica a exclusão do buffer NERDTree:nnoremap <leader>bd :%bd | NERDTree<cr>
Uri
5
Eu usei isso por um longo tempo, mas agora entendo E16: Invalid rangeporque alguns dos buffers no intervalo não existem realmente. Foi ignorando isso até recentemente.
Jon
3
@ Jon Verifique :lspara 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.
Nairou
51
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#
Funciona principalmente bem. mas às vezes %não pode funcionar como todos os seletores. Você poderia adivinhar alguma coisa?
Jinyoung Kim
@JinyoungKim (de [1]) No comando ":% bd", o intervalo '%' será substituído pelos números de linha inicial e final no buffer atual. Em vez de usar '%' como o intervalo, você deve especificar números para o intervalo. Por exemplo, para excluir todos os buffers, você pode usar o comando ": 1,9999bd" [1] vimdoc.sourceforge.net/cgi-bin/vimfaq2html3.pl#8.8
iamnotsam
Acabei de verificar o documento. Então, o intervalo '%' depende de várias linhas de arquivo atuais?
Jinyoung Kim
2
Encontrei função 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.
Jinyoung Kim
2
:help :bdmostra :%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.
Alejandro
25
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
Percebi que, ao retomar as sessões do vim, que restauram os buffers, não consegui mais remover os buffers usando o descrito acima. Em vez disso, eu tive que usar:%bd|e#|bd#
shmup
Melhor solução. Eu adicionei um comando para reabrir o NERDTreenmap <Leader>\c :call CloseAllBuffersButCurrent()<CR>:NERDTree<CR>
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>bdpara 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\|
Não há realmente nenhuma razão para você ter o bdqmapeamento que fecha todos os buffers e sai do vim :q!, quando você pode apenas usar :qa!. A menos que eu estou com vista algo
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
fonte
Tente isto
O bufdo executa o comando para todos os buffers
http://vim.wikia.com/wiki/Run_a_command_in_multiple_buffers
fonte
bd
comando feche o próprio vim;nnoremap <silent> <leader>c :NERDTreeClose<bar>bufdo bd<CR>
.:bufdo
'não deve excluir buffers ou adicionar buffers à lista de buffers'. Portanto, se essa solução funcionar, ela funciona por acidente ... e geralmente não funciona para mim (alterna para um buffer diferente).Eu era capaz de fazer isso facilmente assim:
fonte
:%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):
fonte
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
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#
fonte
%
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
fonte
set nohidden
de ser definido?Usando
e
fonte
Fechando todos os buffers abertos:
Fechando todos os buffers abertos, exceto o atual :
Adicione esta função
.vimrc
e chame-a usando:call CloseAllBuffersButCurrent()
.Mapa de conveniência:
fonte
:%bd|e#|bd#
nmap <Leader>\c :call CloseAllBuffersButCurrent()<CR>:NERDTree<CR>
Coloquei isso no meu arquivo .vimrc
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
fonte
Existe um plugin que faz exatamente isso e um pouco mais!
Confira close-buffers.vim
fonte
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.%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.fonte
Eu gosto
1,100bd
( sugerido por juananruiz ) que parece funcionar para mim.Adicionei um
quit!
ao meu mapeamento para me darIsso mata todos os buffers e desliga o Vim, que é o que eu estava procurando principalmente.
fonte
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 algoQue tal apenas:
(obrigado a https://thoughtbot.com/blog/vim-splits-move-faster-and-more-naturally )
fonte