我正在寻找一个优雅的解决方案(在vim脚本中)迭代所有匹配的 缓冲区中的正则表达式。这就像是
fu! DoSpecialThingsWithMatchedLines()
for matched_line_no in (GetMatchedPositions("/foo\\>.*\\<bar"))
let line = getline(matched_line_no)
call DoItPlease(line)
end for
endfu
有类似的东西吗?我不一定在寻找一个完整的人 解决方案,指引我进入正确方向的任何指针都可以。
谢谢/ Rene
答案 0 :(得分:5)
你可以使用:the global e。
:%g/foo\\>.*\\<bar/call DoItPlease(getline("."))
vim脚本示例:
fun! Doit(line)
echo a:line
endfun
fun! MyDo()
%g/foo/call Doit(getline("."))
endfun
:call MyDo()
答案 1 :(得分:4)
大部分时间我都会使用迈克尔的:global
如果您真的想使用filter(getline('1','$'), 'v:val =~ "foo\\>.*\\<bar"')
,也可以使用:for
。
否则,您只需在循环中调用search()
即可。
编辑:9年后,在脚本中,我现在使用map()
+ filter()
:call map(filter(getline('1','$'), 'v:val =~ "foo\\>.*\\<bar"'), 'DoItPlease(v:val)')
此:
:for
的解决方案快得多,