Vim - Excluir buffer ao ocultar se não for alterado

Vim - Excluir buffer ao ocultar se não for alterado

Costumo alternar entre arquivos abertos em diferentes buffers do Vim.

Ao alternar rapidamente entre arquivos (por exemplo, da lista de correção rápida, resultados de confirmação, tags), os arquivos geralmente são abertos e imediatamente ocultados. No entanto, o buffer permanece aberto, poluindo minha lista de buffers abertos.

Como posso configurar os buffers para fechar em vez de ocultá-los se eles não foram modificados de alguma forma.

Responder1

Não existe realmente uma ótima solução para isso, pois a maioria delas tem deficiências.

Você poderia tentar :set bufhidden=delete(veja'bufhidden'para obter mais detalhes.) Isso parece bem próximo do que você deseja.

Mas 'bufhidden'é uma configuração local para buffer, então você teria que configurá-la para cada novo buffer ou para os buffers que deseja que sejam efêmeros, conforme descreve. Você poderia fazer isso a partir de um autocmdou talvez de alguns deles, dependendo dos seus critérios para quais buffers devem ser excluídos quando ocultos.

Observe também que a documentação do Vim não recomenda fortemente o uso dessa opção!

CUIDADOSO:quando unload, deleteou wipeé usado, as alterações em um buffer são perdidas sem aviso. Além disso, esses valores podem interromper os comandos automáticos que alternam temporariamente entre buffers.

Então isso provavelmente é um fracasso ...

Há também :set nobuflisted(veja'buflisted', nesse caso o buffer existe, mas não está listado na :lssaída.

Também é uma configuração local para um buffer, então você precisa autocmdconfigurá-lo em novos buffers.

Este não parece ser tão perigoso e parece quase fazer o que você pediu. Mas este irá deslistar até mesmo oatualbuffer, ou buffers para as janelas abertas, então isso essencialmente garante que :lsestará sempre vazio, o que o torna inútil. Nesse caso, é realmente melhor do que deixar buffers por aí?

Finalmente, você pode limpar buffers após uma operação grande (por exemplo, envolvendo :argsou correção rápida), depois de terminar e salvar tudo, você pode usar:

:%bd

Isso fechará todos os buffers e deixará você com um novo arquivo vazio para editar. (Veja a documentação para:bdelete.)

Este pode ser um comando útil quando você estiver mudando para algo novo e quiser manter apenas um pequeno punhado de buffers disponíveis, para poder alternar rapidamente entre eles usando substrings curtas de seus nomes de arquivos ou :bnexte amigos.

Responder2

Foi isso que eu descobri, estou feliz com isso até agora.

" Unlist unchanged buffers if they are hidden
function! BufferUnchanged()
  return exists("b:undo_seq_load") && b:undo_seq_load==changenr()
endfunction
function! UnlistUnchangedBuffer()
  if BufferUnchanged()
    set nobuflisted
  endif
endfunction
" Save the undo sequence position on buffer load
autocmd BufReadPost * let b:undo_seq_load=changenr()
autocmd BufWinLeave * call UnlistUnchangedBuffer()

informação relacionada