调用:search()后是否可以获得匹配的字符串


15

在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函数?


1
可悲的是,答案是否定的。
佐藤桂2015年

2
提示:局部变量是函数内部的默认值,因此您可以放弃l:命名空间声明。
彼得·林克

2
在一个函数中,您可能可以执行以下操作::let @/="pattern" | norm! ygn并使寄存器0中的内容可用。
Christian Brabandt

Answers:


7

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

我认为在这里很好: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一个回调函数-每次匹配都会对其进行评估。


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

2
请修正错误:keeppaterns-> keeppatterns。这是造成E488: Trailing characters这是相当棘手的追溯原因。谢谢!
artemave
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.