vim: общее количество буферов

12

в том, с

:buffers

Я получаю количество всех буферов одинаково с

:ls

, но
как я могу получить общее количество буферов?

Хуан Пабло
источник

Ответы:

9

Та же идея, что и у решения Heptite, но в качестве одного лайнера. Многие другие вещи могут быть сделаны таким образом: получить имя буфера (благодаря карте), уничтожить буферы, которые соответствуют шаблону , /programming/2974192/how-can-i-pare-down- vims-buffer-list-to-only-include-active-buffers / 2974600 # 2974600n и т. д.

echo len(filter(range(1, bufnr('$')), 'buflisted(v:val)'))
Люк Эрмитт
источник
14

Ответы пока слишком нахальные. Вот встроенный способ vim:

len(getbufinfo({'buflisted':1}))

Как всегда, см. Справку vim ( :h getbufinfo()) для официального объяснения.

Gid
источник
3
В тот момент, когда вас спросили, ваш ответ был бы невозможен, потому что Вим не поддержал его. Теперь это, наверное, оптимальное решение.
Гептит
4

Насколько мне известно, в Vim нет встроенного метода для этого, но вы можете создать функцию:

function! NrBufs()
    let i = bufnr('$')
    let j = 0
    while i >= 1
        if buflisted(i)
            let j+=1
        endif
        let i-=1
    endwhile
    return j
endfunction

Поместите вышесказанное в текстовый файл с именем, оканчивающимся на .vim,: source it, тогда вы можете сделать что-то вроде:

:let buffer_count = NrBufs()
:echo buffer_count

Примечание от 21 июня: если у вас последняя версия Vim по состоянию на 2017 год, ответ Гида ниже является оптимальным решением.

Heptite
источник
1
Примечание для других, которые находят это: я думаю, что это должно быть 'while i> 0', так как номера буферов начинаются с 1, а не с 0.
Meta
@Meta: я исправил свой ответ. Спасибо. Хотя это и не будет проблемой, поскольку всегда будет хотя бы один буфер.
Гептит
3

Вы ищете возможно?

:echo(bufnr('$'))
ладья
источник
Это "посчитает" буферы, которые были выгружены, поскольку Vim никогда не использует номер буфера повторно, плюс это должно быть: echo bufnr ('$')
Heptite
(Хорошо, ваша версия будет правильно отображать номер последнего загруженного буфера, но синтаксис немного сбивает с толку.)
Heptite
@ Hepite - Да, это была ошибка. Что касается синтаксиса, я не вижу разницы между ними.
Ладья
Они делают то же самое, но: echo - это команда, а не функция, и ее никогда нельзя использовать как функцию (если вы не заключите свою собственную пользовательскую функцию вокруг: echo). Разница важна во многих контекстах VimL.
Гептит
@ Heptite - Должен признать, я понятия не имею, что вы только что сказали ... (здесь больше инженера по клейкой ленте; меньше программиста "код прекрасен")
Ладья
2

Если вы хотите использовать решение Heptite в качестве команды, добавьте в файл .vimrc следующее:

command BufNum echo len(filter(range(1, bufnr('$')), 'buflisted(v:val)'))
Andrzej
источник