Vim: feche todos os buffers, exceto este

196

Como posso fechar todos os buffers no Vim, exceto o que estou editando atualmente?

Rafid
fonte
1
Eu
preencheu

Respostas:

171

Tente isto

bufdo bd

O bufdo executa o comando para todos os buffers

http://vim.wikia.com/wiki/Run_a_command_in_multiple_buffers

gayavat
fonte
Isso não fecha o buffer NERDTree.
22415 Uri
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)
Michael Leonard
143

Eu era capaz de fazer isso facilmente assim:

:%bd|e#
OldTimeGuitarGuy
fonte
4
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#"
shmup
4
@Finn você precisa escapar |:map <leader>o :%bd\|e#<cr>
Halil Özgür
57

Se você não se importa com o atual, é mais simples fazer algo como (nenhum script precisa):

1,100bd
juananruiz
fonte
4
Ele fechará o buffer nerdtree também.
Afshin Mehrabani
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#

iamnotsam
fonte
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

cutemachine
fonte
Perfeito, curto e simples! :)
arkod
49
:% bd é na verdade "todos" em vez de 1-1000.
John Tyree 28/01
Isso depende set nohiddende ser definido?
Felipe Alvarez
15

Usando

:on[ly][!]

e

:h only
klokop
fonte
27
Isso fecha janelas, não buffers.
ZyX 8/09/12
13
Ainda é útil, pois as pessoas podem pesquisar no Google pelo termo errado e o encontrarão. Então, obrigado a vocês dois. :)
archgoon
1
@archgoon sim, mas deve ser especificado na resposta.
andho
10

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 .vimrce chame-a usando :call CloseAllBuffersButCurrent().

Mapa de conveniência:

nmap <Leader>\c :call CloseAllBuffersButCurrent()<CR>
mynyml
fonte
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>
Gjaa
5

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

Yulin
fonte
4

Existe um plugin que faz exatamente isso e um pouco mais!

Confira close-buffers.vim

Niko Bellic
fonte
1

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\|

'" = mantenha minha posição do cursor.

0xMH
fonte
0

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.

LazyRiverYogi
fonte
1
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
SHMUP