在vimscript函数中,我需要在调用l:matched之后将匹配的字符串分配给变量search(),我想知道是否有比我目前正在做的事情更短的方法:

let l:pattern   = '\v^Foo: \zs.*'
let l:line      = search(l:pattern)
let l:line_text = getline(l:line)
let l:matched   = matchstr(l:line, l:pattern)


理想情况下,我想要的是

let l:matched = search_text(l:pattern)


,而无需求助于getline()。我似乎找不到这样的vim函数吗?

评论

可悲的是,答案是否定的。

protip:局部变量是函数内部的默认变量,因此您可以放弃l:名称空间声明。

在函数中,您可能可以这样做::let @ / =“ pattern” |规范! ygn并具有寄存器0中的内容。

#1 楼

由于光标位于比赛的第一个字母上,因此您可以在搜索后执行:normal! y$,并在您的本地变量中获取寄存器内容。

另一种方法,我认为这可以在这里工作很好,可以将:substituten标志一起使用(即不进行实际替换):

function! ActOn(match)
    " do something with the match
    echo a:match
    " [...]
endfunction

function! FindAndCall(regex, func_name)
    execute ':keeppatterns %s/' . a:regex . '/\=' . a:func_name. '(submatch(0))/gn'
endfunction


...,您这样称呼:

:call FindAndCall('^Foo: \zs.*', 'ActOn')


这实际上使ActOn成为回调函数-每次匹配都会对其进行评估。

评论


注意::s带有sub-replace-expression和n标志仅从Vim 7.3.627+起可用。否则,您需要进行实际替换(标记,因为这会将缓冲区标记为已修改)。您可能还想保存和恢复搜索寄存器@ /,或使用:keeppatterns。

– Peter Rincker
15年8月13日在20:43

请修正拼写错误:keeppaterns-> keeppatterns。这导致了E488:尾随字符很难追溯到原因。谢谢!

– artemave
17年8月8日在8:13