0

我希望能够计算缓冲区中 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 numberand所做的一样set relativenumber,没有需要考虑要运行的命令。

我突然想到,这样做的一种方法可能是让 vim 告诉我当前窗口中有多少“显示行”,或者我当前在哪个“显示行”上。

据我所知,vim 目前不支持开箱即用。我遇到的唯一参考是this question,这两个答案似乎明确表示vim不能这样做,尽管我不太清楚。

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

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

4

2 回答 2

1

好吧,你需要数一数可见的线条。我怀疑这应该有效:

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>)
于 2013-09-27T21:49:39.703 回答
0

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

:echo ingo#window#dimensions#NetVisibleLines(line("'<"), line("'>"))
于 2013-09-27T19:04:39.600 回答