使用Vim,如何使用变量存储找到的模式数?

时间:2011-11-10 00:55:09

标签: vim

This question对于获取Vim中某个模式的计数很有帮助,但是对我来说存储计数并对结果求和会很有用,所以我可以回应一个简明的总结。

我正在为一些高中生教授基础HTML课程,我正在使用这个脚本在不离开Vim的情况下快速检查所有页面中所需元素的数量。它工作正常,但是当学生有超过10个.html文件时,手动添加各个部分会很麻烦。

类似的东西:

img_sum = :bufdo %s/<img>//gen

会很好。我想我会写一个ruby脚本来更彻底地检查页面并检查结构,但是现在我很好奇如何在Vim中这样做。

2 个答案:

答案 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