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?

l:declaración del espacio de nombres.:let @/="pattern" | norm! ygny tener el contenido en el registro 0 disponible.Respuestas:
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 lanbandera (es decir, sin una sustitución real ):... y que llamas así:
Esto prácticamente hace
ActOnuna función de devolución de llamada: se evaluará para cada coincidencia.fuente
:scon una expresión sub-replace y elnindicador 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.keeppaterns->keeppatterns. Está causando, loE488: Trailing characterscual es bastante difícil de rastrear hasta la causa. ¡Gracias!