Cómo devolver la primera coincidencia de la búsqueda
Siguiendo mi pregunta sobre algún patrón de búsqueda en vim, me gustaría obtener el texto correspondiente a la primera coincidencia (si existe) de mi patrón de búsqueda, que incluye la posición del cursor y es de varias líneas .
Aquí hay un ejemplo de texto (celda de Python de rebaja):
```python
x = 10
```
```python
[p]rint(x)
```
la []
indica positon cursor.
Mi patrón de búsqueda:
\(```python\n\)\@<=\%(\%(```\)\@!\_.\)*\%#\_.\{-}\(```\)\@=
Que corresponde al texto print(x)
.
Básicamente, me gustaría extraer este texto y guardarlo en una variable en vimscript.
Gracias.
Respuestas
Así que descubrí que gn
era el que necesitaba; de :help gn
:
Busque hacia adelante el último patrón de búsqueda utilizado, como con n, e inicie el modo Visual para seleccionar la coincidencia. Si el cursor está en el partido, lo selecciona visualmente. Si un operador está pendiente, opera en el partido.
Eso significa que puedo combinarlo con yank y obtener el texto del registro en una variable.
Así que hice una función para que el texto coincidiera con un patrón:
function! GetMatch(pattern)
get matched = search(a:pattern)
if l:matched
" save register content
let savereg = @9
normal "9ygn
let match = @9
" restore register content
let @9 = l:savereg
else
let match = ""
endif
return l:match
endfunction
Actualización: Otra versión sin la prueba:
function! GetMatch(pattern)
let found = search(a:pattern)
" save register content
let savereg = @9
normal "9ygn
let match = @9
" restore register content
let @9 = l:savereg
return l:match
endfunction
Un poco exagerado, pero te remito a ¿Cómo ejecutar un comando de Python basado en un grupo coincidente de un patrón?
Según el patrón (primer grupo de coincidencia), puede ejecutar un comando de Python. Aquí configuro una variable vim.
:%GL/PATTERN/py vim.command("let var='" + match + '"')
pueden ocurrir algunos problemas de escape.