En una función vimscript, necesito asignar una cadena coincidente a una variable l:matched
despué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! ygn
y 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
:substitute
con lan
bandera (es decir, sin una sustitución real ):... y que llamas así:
Esto prácticamente hace
ActOn
una función de devolución de llamada: se evaluará para cada coincidencia.fuente
:s
con una expresión sub-replace y eln
indicador 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 characters
cual es bastante difícil de rastrear hasta la causa. ¡Gracias!