Поскольку нельзя влиять на список буферов с помощью команды :bufdo
-argument (см. :help :bufdo
), мы должны использовать более многословный, но довольно простой скрипт Vim.
Функция, перечисленная ниже, перечисляетвсе существующие номера буфера и удаляет те, у которых нет имени (отображается как [No Name]
в интерфейсе) и нет несохраненных изменений.(Последнее гарантируется командой :bdelete
, которая без знака !
не удаляет измененный буфер).
function! DeleteEmptyBuffers()
let [i, n; empty] = [1, bufnr('$')]
while i <= n
if bufexists(i) && bufname(i) == ''
call add(empty, i)
endif
let i += 1
endwhile
if len(empty) > 0
exe 'bdelete' join(empty)
endif
endfunction
Если вы хотите полностью удалить пустые буферы, включая незагруженные, рассмотрите (с осторожностью!) замену bdelete
на bwipeout
(см. :help :bd
, :help :bw
).
Чтобы проверить содержимое буфера для удаления, используйте функцию getbufline()
.Например, чтобы быть абсолютно уверенным, что в буфере нет текста, измените оператор if
внутри цикла while
следующим образом.
if bufloaded(i) && bufname(i) == '' && getbufline(i, 1, 2) == ['']
Обратите внимание, что bufexists()
заменено на bufloaded()
Вот.Это необходимо, поскольку возможно получить содержимое только тех буферов, которые загружены (для незагруженных буферов getbufline()
возвращает пустой список независимо от их содержимого).