如何计算Vim中显示的行数?

时间:2013-09-27 18:50:56

标签: 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 numberset relativenumber,而无需考虑要运行的命令。

在我看来,这样做的方法可能是让vim告诉我当前窗口中有多少“显示的行”,或者我当前正在显示的“显示的行”。

据我所知,vim目前不支持开箱即用。我遇到的唯一参考是this question,其中两个答案似乎明确表示vim无法做到这一点,尽管对我来说不是很清楚。

即使使用某种神奇的插件,vim也无法做到这一点吗?如果需要的话,我不会反对写我自己的,但我甚至不知道从哪里开始寻找我需要写这样的东西。

同样,我知道有数百种简单的方法可以“计算xml元素的子元素数”;我只是想在编辑这样的文件时大致知道我所在的数字元素(即#23 of 100)。

2 个答案:

答案 0 :(得分:0)

我的ingo-library plugin有一个计算它的函数。您需要将开头和结束行号传递给它,它将返回可见的展开行数。例如,对于当前的视觉选择:

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

答案 1 :(得分: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>)