Вы ищете:
:echo map(filter(range(0, bufnr('$')), 'bufwinnr(v:val)>=0'), 'bufname(v:val)')
или точнее:
exe 'bw '.join(filter(range(0, bufnr('$')), 'bufwinnr(v:val)<0'), ' ')
РЕДАКТИРОВАТЬ: предыдущий ответ не учитывал несколько вкладок.
Кажется, я использовал комплексный подход. Список открытых и отображаемых буферов можно получить благодаря tabpagebuflist()
с:
let tabs = range(1, tabpagenr())
echo lh#list#unique_sort(eval(join(map(tabs, 'tabpagebuflist(v:val)'), '+')))
(lh#list#unique_sort()
взято из lh-vim-lib , оно определяет функцию sort + unique, которую vim не предоставляет)
Для того, чтобы иметь не открытые буферы, становится немного сложнее. Либо мы используем цикл каждой вкладки для получения не отображаемых буферов, либо мы делаем различие между предыдущим результатом и буферизирующими буферами:
let tabs = range(1, tabpagenr())
let windowed = lh#list#unique_sort(eval(join(map(tabs, 'tabpagebuflist(v:val)'), '+')))
let existing = filter(range(0,bufnr('$')), 'bufexists(v:val)')
let non_windowed = filter(copy(existing), 'match(windowed, "^".v:val."$")<0')
echo non_windowed