2013-09-27 3 views
0

Я хотел бы иметь возможность подсчитать, сколько строк в буфере фактически отобразит Vim. В частности:Как подсчитать количество отображаемых строк в Vim?

У меня есть файл XML с одним корневым элементом и многих дочерних элементов одного и того же типа, который выглядит как этот

<fields> 
    <field field="Delegation"> 
    ... 
    </field> 
    <field field="Assignment"> 
    ... 
    </field> 
    ⋮ 
</fields> 

Я сложенной все элементы поля на одной линии, так что она выглядит что-то вроде это:

<fields> 
+-- 12 lines: <field field="Delegation"> 
+-- 7 lines: <field field="Assignment"> 
    ⋮ 
</fields> 

В результате я хотел бы подсчитать количество элементов поля в файле. Теперь я знаю, что могу сделать это с помощью чего-то вроде :g/field field/p или других команд vim или внешних программ и т. Д. Но я хотел бы просто взглянуть куда-нибудь, чтобы получить приблизительное представление об этой информации, так же, как и с set number и set relativenumber, не задумываясь о командах для запуска.

Мне пришло в голову, что способ сделать это может заключаться в том, чтобы заставить vim рассказать мне, сколько «отображаемых строк» ​​есть в текущем окне или «отображаемая строка», в которой я сейчас.

Из того, что я могу сказать, vim в настоящее время не поддерживает это из коробки. Единственная ссылка, которую я натолкнула на что-то вроде этого, - this question, где два ответа, похоже, явно говорят, что vim не может этого сделать, хотя это было не очень понятно для меня.

В этом случае vim не может этого сделать, даже с каким-то волшебным плагином? Я бы не прочь написать свои собственные, если понадобится, но я даже не знаю, с чего начать искать то, что мне нужно будет написать.

Опять же, я знаю, что есть сотни простых способов «подсчитать количество дочерних элементов элемента xml»; Я просто хочу знать, какой элемент числа я нахожу (т. Е. # 23 из 100) при редактировании таких файлов.

ответ

0

Ну, вы должны считать себя видимыми линиями. Я подозреваю, что это должно работать:

fu! VisibleLines(start, end) 
let result=0 
let i=a:start 

while (i <= a:end) 
if foldclosed(i) > 0 
    let i = foldclosedend(i)+1 
    continue 
    endif 
    let i+=1 
    let result += 1 
endw 
return result 
endfu 
com! -range VisibleLines :echo VisibleLines(<line1>,<line2>) 
+0

Спасибо! Это - почти - отлично работает. Мне просто нужно было увеличить результат внутри блока if, чтобы я подсчитал каждый сложенный блок как 1 строку вместо 0 (так как это то, что я вижу, и что подсчитывает, сколько у меня сложенных тегов). – Danwizard208

+0

Конечно, вы правы –

0

У меня ingo-library plugin есть функция, которая вычисляет это. Вам необходимо передать ему номер начальной и конечной строки, и он вернет количество видимых развернутых строк. Например, для текущего визуального выбора:

:echo ingo#window#dimensions#NetVisibleLines(line("'<"), line("'>")) 
+0

Спасибо, это отлично работает. Есть ли хороший способ получить документацию для отдельных функций в вашей библиотеке? В этом случае функция достаточно проста для определения (кажется, в значительной степени идентичной функции Христиана выше), но мне любопытно узнать, могут ли быть полезны другие функции в библиотеке. Я принял ответ Кристиана, поскольку я думаю, что подробное описание того, как это будет сделано, будет полезно для меня и других, если мы хотим чего-то более сложного. – Danwizard208

+0

@ Danwizard208 Я пытаюсь документировать их непосредственно в исходном коде, но уровень в настоящее время меняется. Это больше поддержка библиотеки для моих собственных плагинов, чем для общественного потребления. –

Смежные вопросы