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

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.

Leave a Comment

Your email address will not be published. Required fields are marked *

web tasarım