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 autocmd
ou 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
,delete
ouwipe
é 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 :ls
saída.
Também é uma configuração local para um buffer, então você precisa autocmd
configurá-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 :ls
estará 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 :args
ou 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 :bnext
e 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()