Как я могу срезать свой буферный список, чтобы только включать буферы, которые в настоящее время открыты в окне/вкладке?
Когда я выполнял Vim в течение долгого времени, список буферов, показанных :ls
команда является слишком большой для работы с. Идеально, я хотел бы удалить все буферы, которые не в настоящее время видимы на вкладке или окне путем выполнения пользовательской команды такой как :Only
. Кто-либо может предложить, как достигнуть этого?
Это похоже :bdelete
команда может принять список буферных чисел, но я не уверен, как перевести вывод из :ls
к формату, который может быть использован :bdelete
команда. Любая справка ценилась бы.
Позволяет говорят, что на моей сессии Vim я открыл 4 файла. :ls
выводы команды:
:ls
1 a "abc.c"
2 h "123.c"
3 h "xyz.c"
4 a "abc.h"
Буферный 1 находится на текущей вкладке, и и буферные 4 находится на отдельной вкладке, но буферизует 2, и 3 оба скрыты. Я хотел бы выполнить команду :Only
, и это вытерло бы буферы 2 и 3, таким образом, :ls
команда произвела бы:
:ls
1 a "abc.c"
4 a "abc.h"
Этот пример не делает предложенный :Only
управляйте выглядят очень полезными, но если бы у Вас есть список 40 буферов, это очень приветствовалось бы.
Я адаптировал решение Laurence Gonslaves.
command! -nargs=* Only call CloseHiddenBuffers()
function! CloseHiddenBuffers()
" figure out which buffers are visible in any tab
let visible = {}
for t in range(1, tabpagenr('$'))
for b in tabpagebuflist(t)
let visible[b] = 1
endfor
endfor
" close any buffer that are loaded and not visible
let l:tally = 0
for b in range(1, bufnr('$'))
if bufloaded(b) && !has_key(visible, b)
let l:tally += 1
exe 'bw ' . b
endif
endfor
echon "Deleted " . l:tally . " buffers"
endfun
Я изменил его, чтобы использовать bwipeout
вместо bdelete
, и добавил сообщение, показывающее, сколько буферов было удалено.
Если вы сказали, что 4 буфера открыты:
:ls
1 abc.c
2 123.c
3 xyz.c
4 abc.h
и вы хотите «закрыть» буфер 3 «xyz.c»:
:bd3
результаты после удаления буфера 3:
:ls
1 abc.c
2 123.c
4 abc.h
Вы ищете:
: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