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函数吗?#1 楼
由于光标位于比赛的第一个字母上,因此您可以在搜索后执行:normal! y$
,并在您的本地变量中获取寄存器内容。另一种方法,我认为这可以在这里工作很好,可以将
:substitute
与n
标志一起使用(即不进行实际替换):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
评论
可悲的是,答案是否定的。protip:局部变量是函数内部的默认变量,因此您可以放弃l:名称空间声明。
在函数中,您可能可以这样做::let @ / =“ pattern” |规范! ygn并具有寄存器0中的内容。