我希望能够计算缓冲区中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 of 100)。
答案 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>)