¿Es posible obtener la cadena coincidente después de llamar: search ()

14

En una función vimscript, necesito asignar una cadena coincidente a una variable l:matcheddespués de llamar search()y me pregunto si hay una forma más corta de lo 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, me gustaría algo como

let l:matched = search_text(l:pattern)

sin recurrir a getline(). ¿Existe tal función vim que parezco incapaz de encontrar?

René Nyffenegger
fuente
1
Lamentablemente, la respuesta es no.
Sato Katsura
1
protip: las variables locales son el valor predeterminado dentro de las funciones, por lo que probablemente pueda renunciar a la l:declaración del espacio de nombres.
Peter Rincker
1
en una función que probablemente pueda hacer: :let @/="pattern" | norm! ygny tener el contenido en el registro 0 disponible.
Christian Brabandt

Respuestas:

7

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 obtener el contenido del registro en su variable local.

Otro enfoque, que creo que funcionaría muy bien aquí, sería usarlo :substitutecon la nbandera (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 que llamas así:

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

Esto prácticamente hace ActOnuna función de devolución de llamada: se evaluará para cada coincidencia.

VanLaser
fuente
1
Nota: :scon una expresión sub-replace y el nindicador solo está disponible desde Vim 7.3.627+. De lo contrario, debe hacer una sustitución real (cojo, ya que esto marcará el búfer como modificado). Probablemente también desee guardar y restaurar el registro de búsqueda @/o el uso :keeppatterns.
Peter Rincker
1
Corrige el error tipográfico: keeppaterns-> keeppatterns. Está causando, lo E488: Trailing characterscual es bastante difícil de rastrear hasta la causa. ¡Gracias!
artemave