This question对于获取Vim中某个模式的计数很有帮助,但是对我来说存储计数并对结果求和会很有用,所以我可以回应一个简明的总结。
我正在为一些高中生教授基础HTML课程,我正在使用这个脚本在不离开Vim的情况下快速检查所有页面中所需元素的数量。它工作正常,但是当学生有超过10个.html
文件时,手动添加各个部分会很麻烦。
类似的东西:
img_sum = :bufdo %s/<img>//gen
会很好。我想我会写一个ruby脚本来更彻底地检查页面并检查结构,但是现在我很好奇如何在Vim中这样做。
答案 0 :(得分:7)
这个问题可以通过一个与内置的计数器分开来解决
:substitute
命令:使用Vim-script变量保存模式的数量
火柴。注册每个匹配并修改特定内容的便捷方式
相应的变量,是利用替代品
:substitute
命令的表达式功能(参见:help sub-replace-\=
)。
我们的想法是使用一个替换来评估表达式的增加
每次出现时都有一个计数器,并且不会更改它正在运行的文本
上。
该技术的第一部分无法直接实施
因为禁止在表达式中使用Ex命令(包括\=
替换表达式),因此无法使用:let
命令修改变量。 Answering问题“gVim find/replace
with counter”,我提出了一个克服这种限制的简单技巧,
它基于使用单项列表(或包含单个项目的字典)
键值对)。由于map()
函数转换列表或字典
在适当的位置,只能在受约束的表达式上下文中更改项目。
要做到这一点,应该调用传递表达式的map()
函数
评估新值以及包含当前值的列表。
该技术的后半部分是如何在使用时避免更改文本
替换命令。为了实现这一点,人们可以制作模式
通过预先加\ze
或通过附加\zs
原子来获得零宽度(参见
:help /\zs
,:help /\ze
)。以这种方式,修改的模式捕获
在初始发生之前或之后的零宽度字符串
图案。因此,如果替换文本也为空,则替换不会
导致缓冲区内容发生任何变化。做出替代品
表达式求值为空字符串,可以只提取一个空字符串
来自该表达式的结果值的子字符串或子列表。
这两个想法在以下命令中付诸实施。
:let n=[0] | bufdo %s/pattern\zs/\=map(n,'v:val+1')[1:]/ge
答案 1 :(得分:0)
我认为上面的答案很难理解,并且使用外部命令grep
的方式更加漂亮:
:let found=0
:bufdo let found=found+(system('grep "<p>" '.expand('%:p') . '| wc -l'))
:echo found