Как я могу срезать буферный список Vim, чтобы только включать активные буферы

Как я могу срезать свой буферный список, чтобы только включать буферы, которые в настоящее время открыты в окне/вкладке?

Когда я выполнял 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 буферов, это очень приветствовалось бы.

8
задан nelstrom 4 June 2010 в 19:32
поделиться

3 ответа

Я адаптировал решение 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, и добавил сообщение, показывающее, сколько буферов было удалено.

11
ответ дан 5 December 2019 в 08:50
поделиться

Если вы сказали, что 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
0
ответ дан 5 December 2019 в 08:50
поделиться

Вы ищете:

: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
7
ответ дан 5 December 2019 в 08:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: