vimrc – ¿Cuál es la diferencia entre los átomos '\ zs' y '\ @ <=' en Vim regex?

Pregunta:

Esto es lo que obtengo de la documentación: \zs "comienza la parte resaltada" después de hacer coincidir la expresión regular anterior, y \@<= "comienza la parte resaltada" después de hacer coincidir el átomo anterior. Pero no entiendo exactamente las sutilezas de esto, entonces, ¿alguien puede explicar en qué se diferencian un poco más en profundidad?

Esto es lo que me dio curiosidad: si corro

/\_s\zsnnoremap

es decir, seleccione nnoremap precedido por un espacio o un comienzo de línea (es decir, la nueva línea de la línea anterior, por lo tanto, la \_ anterior al s ) y luego ejecutar gn para entrar en Visual Mode y seleccionar visualmente el siguiente partido, por alguna razón, sólo se se selecciona la primera columna (es decir, la primera n en nnoremap ), a pesar de que toda la palabra nnoremap está resaltada con :hlsearch activado.

Sin embargo, si en cambio ejecuto la búsqueda

/\_s\@<=nnoremap

y luego intente gn , todo el nnoremap está seleccionado correctamente. ¿Qué podría estar pasando aquí? ¿Descubrí algún error desconocido?

Respuesta:

Parece que de hecho encontraste un error desconocido. Implementé el gn textobject en 2012 para Vim 7.3 algo. Básicamente funciona de la siguiente manera:

1) Busca hacia atrás la última coincidencia de la expresión regular actual.

2) Busca hacia adelante la siguiente coincidencia de la expresión regular actual.

Esto debería dejar en claro que el cursor estará al comienzo del próximo partido, incluso si ya estaba allí al comienzo del 1). Por fin

3) busca el final de la expresión regular actual. y coloca el cursor allí.

Ahora, lo que sucede aquí es que la búsqueda del final de la coincidencia actual se reinicia y regresa al final de la coincidencia anterior (porque el wrapscan ya está configurado, después de haber sido desactivado para 1)). A continuación, establece el marcador visual en el área desde el inicio (final del punto 2) y el área movida por el siguiente elemento de búsqueda 3).

Examinaré más de cerca el problema y probablemente enviaré un parche para Vim más adelante.

[Actualización 22.05.2018] He escrito y enviado un parche para corregir este comportamiento.

[Update2 22.05.2018] Y el parche se ha fusionado con el nivel de parche 8.1.0018

[Actualización 22.10.2019] A partir del parche 8.1.629 de Vim, el tercer paso ya no se realiza. En cambio, Vim ahora puede determinar el final de la partida cuando encuentra el comienzo de la partida (Paso 2)

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım