Vim - Удалять буфер при скрытии, если он не был изменен

Vim - Удалять буфер при скрытии, если он не был изменен

Я обычно переключаюсь между файлами, открытыми в разных буферах Vim.

При быстром переключении между файлами (например, из списка quickfix, результатов Ack, тегов) файлы часто открываются и тут же скрываются. Однако буфер остается открытым, загрязняя мой список открытых буферов.

Как сделать так, чтобы буферы закрывались, а не скрывались, если они не были изменены каким-либо образом?

решение1

На самом деле, идеального решения для этой проблемы не существует, поскольку большинство из них имеют недостатки.

Вы можете попробовать :set bufhidden=delete(см.'bufhidden'(для получения более подробной информации.) Это выглядит довольно близко к тому, что вам нужно.

Но 'bufhidden'это настройка, которая является локальной для буфера, поэтому вам придется устанавливать ее для каждого нового буфера или для буферов, которые вы хотите сделать эфемерными, как вы описываете. Вы могли бы потенциально сделать это из одного autocmdили, возможно, нескольких из них, в зависимости от ваших критериев того, какие буферы следует удалять при скрытии.

Также обратите внимание, что документация Vim настоятельно рекомендует не использовать эту опцию!

ОСТОРОЖНЫЙ:при использовании unload, deleteили wipeизменения в буфере теряются без предупреждения. Кроме того, эти значения могут нарушить работу автокоманд, которые временно переключаются между буферами.

Так что это, вероятно, не вариант...

Также есть :set nobuflisted(см.'buflisted', в этом случае буфер существует, но не отображается в :lsвыводе.

Это также локальная настройка буфера, поэтому вам понадобится autocmdустановить ее для новых буферов.

Этот не кажется таким уж опасным, и, кажется, почти делает то, о чем вы просили. Но этот вычеркнет дажетекущийбуфер или буферы для открытых окон, так что это по сути гарантирует, что :lsон всегда будет пустым, что делает его бесполезным. В таком случае, действительно ли лучше, чем оставлять буферы?

Наконец, вы можете очистить буферы после большой операции (например, включающей :argsили быстрой коррекции). После того, как вы все сделали и сохранили, вы можете использовать:

:%bd

Это закроет все буферы и оставит вам новый пустой файл для редактирования. (См. документацию для:bdelete.)

Это может быть полезной командой, когда вы переключаетесь на что-то новое и хотите иметь возможность хранить только небольшое количество буферов, чтобы можно было быстро переключаться между ними, используя короткие подстроки имен файлов или :bnextи тому подобное.

решение2

Вот что у меня получилось, и пока я доволен.

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

Связанный контент