Удаление всех пустых буферов в VIM - PullRequest
16 голосов
/ 01 июля 2011

У меня сейчас есть что-то вроде 120 буферов в Vim.Около 50% этих буферов являются пустыми файлами.Я хотел бы как-то использовать bufdo!, чтобы закрыть все пустые буферы.Есть ли способ сказать:

bufdo! (something)

Где (something) - это условная команда, которая bdelete s текущий буфер, ЕСЛИ длина / размер этого буфера равна нулю?

Ответы [ 3 ]

13 голосов
/ 03 июля 2011

Поскольку нельзя влиять на список буферов с помощью команды :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() возвращает пустой список независимо от их содержимого).

11 голосов
/ 11 апреля 2012

Я использовал следующую функцию для выполнения работы:

function! s:CleanEmptyBuffers()
    let buffers = filter(range(1, bufnr('$')), 'buflisted(v:val) && empty(bufname(v:val)) && bufwinnr(v:val)<0 && !getbufvar(v:val, "&mod")')
    if !empty(buffers)
        exe 'bw ' . join(buffers, ' ')
    endif
endfunction

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

6 голосов
/ 01 июля 2011

Единственное, что я могу придумать для этого, - это создать функцию, которая сообщает, пустой буфер или нет. Примерно так:

function! BufferIsEmpty()
    if line('$') == 1 && getline(1) == '' 
        return 1
    else
        return 0
    endif
endfunction

" Test it like this:
echo BufferIsEmpty()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...