Cómo devolver la primera coincidencia de la búsqueda

Aug 21 2020

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

4 NickSkywalker Aug 22 2020 at 14:26

Así que descubrí que gnera 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
1 eyalkarni Aug 22 2020 at 05:05

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.