Pregunta:
En una función vimscript, necesito asignar una cadena coincidente a una variable l:matched
después de llamar a search()
y me pregunto si hay una forma más corta de la que estoy haciendo actualmente:
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)
Idealmente, querría algo como
let l:matched = search_text(l:pattern)
sin recurrir a getline()
. ¿Existe tal función vim que parezco incapaz de encontrar?
Respuesta:
Dado que el cursor se coloca en la primera letra de la coincidencia, probablemente podría hacer un :normal! y$
después de la búsqueda y obtenga el contenido del registro en su variable local.
Otro enfoque, que creo que funcionaría muy bien aquí, sería usar :substitute
con la bandera n
(es decir, sin una sustitución real ):
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
… y al que llamas así:
:call FindAndCall('^Foo: \zs.*', 'ActOn')
Esto prácticamente convierte a ActOn
una función de devolución de llamada: se evaluará para cada coincidencia.