Vim: elimina el búfer al ocultarlo si no se modifica

Vim: elimina el búfer al ocultarlo si no se modifica

Tiendo a desplazarme entre archivos abiertos en diferentes buffers de Vim.

Al cambiar rápidamente entre archivos (por ejemplo, de la lista de arreglos rápidos, resultados de confirmación, etiquetas), los archivos a menudo se abren y luego se ocultan inmediatamente. Sin embargo, el búfer permanece abierto, lo que contamina mi lista de búfer abiertos.

¿Cómo puedo configurar los buffers para que se cierren en lugar de ocultarse si no se han modificado de ninguna manera?

Respuesta1

Realmente no existe una gran solución para eso, ya que la mayoría de ellas tienen deficiencias.

Podrías intentar :set bufhidden=delete(ver'bufhidden'para obtener más detalles.) Esto se parece bastante a lo que desea.

Pero 'bufhidden'es una configuración que es local al búfer, por lo que tendría que configurarla para cada búfer nuevo, o para los búferes que desea que sean efímeros como lo describe. Potencialmente, podría hacerlo desde uno autocmdo quizás algunos de ellos, dependiendo de sus criterios sobre qué buffers deben eliminarse cuando están ocultos.

También tenga en cuenta que la documentación de Vim recomienda encarecidamente no utilizar esa opción.

CUIDADOSO:cuando se utiliza o los cambios en un búfer se pierden sin previo unloadaviso delete. wipeAdemás, estos valores pueden interrumpir los comandos automáticos que cambian temporalmente entre búferes.

Entonces eso probablemente no sea un comienzo...

También hay :set nobuflisted(ver'buflisted', en cuyo caso el búfer existe, pero no aparece en :lsla salida.

También es una configuración local para un búfer, por lo que necesitaría autocmdconfigurarlo en nuevos búferes.

Este no parece ser tan peligroso y parece casi hacer lo que pediste. Pero este eliminará incluso elactualbúfer, o búferes para las ventanas abiertas, por lo que esto esencialmente asegura :lsque siempre estará vacío, lo que lo hace inútil, en cuyo caso, ¿es realmente mejor que dejar búferes?

Finalmente, puede limpiar los buffers después de una operación grande (por ejemplo, involucrar :argso arreglar rápidamente), una vez que haya terminado y haya guardado todo, puede usar:

:%bd

Esto cerrará todos los buffers y le dejará con un nuevo archivo vacío para editar. (Ver documentación para:bdelete.)

Este podría ser un comando útil una vez que esté cambiando a algo nuevo y desee poder mantener solo un pequeño puñado de buffers, para poder cambiar rápidamente entre ellos usando subcadenas cortas de sus nombres de archivos o :bnextamigos.

Respuesta2

Esto es lo que se me ocurrió, estoy contento con ello hasta ahora.

" 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()

información relacionada