在vim脚本/函数中迭代匹配的最简单/最优雅的方法是什么?

时间:2009-12-09 09:01:21

标签: vim

我正在寻找一个优雅的解决方案(在vim脚本中)迭代所有匹配的 缓冲区中的正则表达式。这就像是

fu! DoSpecialThingsWithMatchedLines()

  for matched_line_no in (GetMatchedPositions("/foo\\>.*\\<bar"))
      let line = getline(matched_line_no)
      call DoItPlease(line)
  end for

endfu

有类似的东西吗?我不一定在寻找一个完整的人 解决方案,指引我进入正确方向的任何指针都可以。

谢谢/ Rene

2 个答案:

答案 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的解决方案快得多,
  • 调试更友好(截至今天给定Vim脚本集成调试器)
  • 保持各种寄存器/历史不变