Feche e descarregue um buffer sem sair do Vim

55

Frequentemente, carregarei algumas informações em um buffer temporário e depois as fecharei :clo!. Mas isso oculta o buffer em vez de descarregá-lo completamente, mesmo que eu tenha nohiddendefinido. Acho isso cansativo, pois recebo uma confirmação extra ao sair do Vim, sobre o conteúdo que eu já (pensei ter) descartado.

Em :q!vez disso, eu poderia usar , mas esse é um mau hábito, porque ele sairá completamente do Vim se houver apenas um buffer restante, o que também é irritante. Pior, se eu digitar :qa!, poderia perder muito trabalho.

Existe um meio termo? Eu realmente gostaria de algum comando que mata o buffer atual, mas não sai do Vim. Não sou contra escrever no Vimscript, mas prefiro evitá-lo se o comando já existir.

Kevin
fonte

Respostas:

70

Há um comando para fazer exatamente isso: :bdeleteou apenas :bd. Por padrão, ele descarregará o buffer atual. Para descarregar outro buffer, primeiro obtenha a lista de todos os buffers com o :bufferscomando e, depois disso, você pode especificar o número após :bdremovê-lo. Além disso, :bd+ space+ tabpermite a conclusão usando o nome do buffer.

tivn
fonte
11
Isso funcionará no último buffer aberto, que não é exatamente o que eu queria, mas, como não sai, é bom o suficiente para meus propósitos.
Kevin
O vim-bbye plug-in pode ser o que você está procurando: github.com/moll/vim-bbye
alxndr
11
Isso não funciona no vi
redolent 16/08
Além disso, o alias interno :lsé mais fácil (imo) para lembrar e faz o mesmo que:buffers
kuzyn
Isso não descarrega o buffer. Na verdade, nem sequer fecha. Simplesmente desativa 'buflisted'. vim.wikia.com/wiki/Vim_buffer_FAQ
BTRUE 16/02
27

Você pode apagar completamente um buffer usando o comando: bwipeout (ou: bw). Isso remove completamente o buffer da memória, incluindo quaisquer marcas, configurações de opções etc. que você adicionou a ele. Da mesma forma,: bdelete (ou: bd) remove o buffer, mas o deixa na memória e mantém marcas e configurações de opções.

Conforme o comentário de Tom Hale, a documentação do Vim recomenda o uso de: bd over: bw, a menos que você saiba o que está fazendo. Eu costumo usar: bw porque gosto da idéia de remover completamente o buffer da memória e não uso muito de marcas, configurações de opções específicas do buffer, etc., a ponto de precisar que eles permaneçam após o fechamento do buffer.

Como o comando: quit (: q), o Vim apresentará um erro se o buffer tiver sido alterado. Para resolver isso, você pode acrescentar um ponto de exclamação após o comando para suprimir o prompt. Outra opção, em vez de adicionar pontos de exclamação a tudo, é adicionar "set confirm" ao seu vimrc. Com esse conjunto, o vim solicitará que você salve as alterações do arquivo ao fechar.

: bufdo é um comando útil que executa outro comando em todos os buffers ativos. A combinação do comando: bufdo com o comando: bw /: bd permite remover todos os buffers ativos de uma só vez. Ainda é possível usar o ponto de exclamação para suprimir erros, mas se você o colocar depois de: bufdo, after: bw ou after causa resultados diferentes para cada um:

:bd          - deletes the current buffer, error if there are unwritten changes
:bd!         - deletes the current buffer, no error if unwritten changes
:bufdo bd    - deletes all buffers, stops at first error (unwritten changes)
:bufdo! bd   - deletes all buffers except those with unwritten changes
:bufdo! bd!  - deletes all buffers, no error on any unwritten changes

:bw          - completely deletes the current buffer, error if there are unwritten changes
:bw!         - completely deletes the current buffer, no error if unwritten changes
:bufdo bw    - completely deletes all buffers, stops at first error (unwritten changes)
:bufdo! bw   - completely deletes all buffers except those with unwritten changes
:bufdo! bw!  - completely deletes all buffers, no error on any unwritten changes

:set confirm - confirm changes (Yes, No, Cancel) instead of error

Aqui estão alguns outros comandos úteis do buffer:

:ls          - list open buffers
:b N         - open buffer number N (as shown in ls)
:tabe +Nbuf  - open buffer number N in new tab
:bnext       - go to the next buffer (:bn also)
:bprevious   - go to the previous buffer (:bp also)

Há muito mais para lidar com buffer que está fora do escopo desta questão. Dê uma olhada em:
http://vim.wikia.com/wiki/Vim_buffer_FAQ http://vimdoc.sourceforge.net/htmldoc/windows.html#buffers

Soylent17
fonte
Você pode adicionar alguma explicação a esta resposta?
EvergreenTree
A ajuda diz "não usam este se você não sabe o que está fazendo", indicando que :bdé preferido na maioria dos casos
Tom Hale
11
@ TomHale Seria bom saber o que mais :bwfaz além de "Tudo relacionado ao buffer está perdido. Todas as marcas nesse buffer se tornam inválidas, as configurações de opções são perdidas etc.". Isso me parece perfeitamente razoável se eu quiser fechar um buffer como seria se eu deixasse o Vim completamente.
Kenny Evitt
Eu prefiro: bw over: bd porque se você usar: bd e, em seguida, pressione <ctrl - ^> para ir para o último buffer usado, ele o trará da memória. : BW me dá mais controle e faz o que eu quero ^^
eli
isso é ótimo! obrigado @ Soylent17!
apollo