¿Hay un comando en Vim / Vi para mover el cursor al final de un resaltado de búsqueda?

85

¿Hay algún comando en Vim / Vi para moverse dentro de un segmento de búsqueda seleccionado?

Por ejemplo, si busco una palabra, ¿hay algún comando para mover el cursor al final del segmento resaltado? Digamos que tengo una palabra, "FishTaco" y quiero buscar todas las instancias de "Fish" e insertar algo después. Sé que podría hacer un reemplazo global, pero ¿qué pasa si solo quiero hacer el cambio en un par de instancias no secuenciales?

Pude ver dónde sería conveniente poder mover el cursor al final del segmento resaltado actual para realizar una acción.

Jordan Parmer
fuente
3
Esta no es una respuesta a la pregunta, pero para lograr su objetivo final de reemplazar todo Fishcon FishTaco, podría hacer :%s/Fish\(Taco\)\@!/&Taco/, que buscará todos los que Fishno hayan seguido Tacoy lo reemplazará con FishTaco. Combina una búsqueda anticipada negativa con un reemplazo que incluye el término coincidente seguido de Taco.
Jim Stewart
@JimStewart No tengo idea de por qué este comentario no tiene al menos tantos +1 como la respuesta. Este es vim de nivel ninja.
Still.Tony

Respuestas:

134

Puedes hacerlo con esto:

/Fish/e

El /eal final coloca el cursor al final de la región de búsqueda (en lugar del primer carácter por defecto.

Tim
fuente
32
Tenga en cuenta que puede agregar + n o -n para colocar el cursor n caracteres antes o después del final.
Nathan Fellman
10
Vale la pena señalar que después de haber realizado la /Fishbúsqueda, puede saltar al final con //ey desde Vim 7.4 puede usar gnpara resaltar visualmente el resultado encontrado.
smathy
Eche un vistazo a la respuesta de @ghbarratt también, más opciones para ubicar el cursor en la coincidencia resaltada.
Nima
81

Si solo desea colocar el cursor después del último carácter de Fish, puede usar

/Fish/e+1

que colocará el cursor después de la h. (Sin el, +1el cursor terminará a la izquierda del último carácter).

Si está particularmente interesado en colocar el cursor después de Fish, pero solo cuando aparece en "FishTaco", puede probar una de las siguientes opciones:

Puedes usar

/FishTaco/s+4

y su cursor terminará entre Fish y Taco. los/s+4 coloca el cursor 4 lugares después del inicio del término de búsqueda.

También podrías usar

/FishTaco/e-3

que colocará el cursor 3 lugares a la izquierda del lado izquierdo del último carácter (final).

También puedes usar

/FishTaco/b+4 

porque /b+4será tratado como /s+4.

ghbarratt
fuente
13
Gran explicación, pero ahora solo tengo hambre.
Kenny
27

Si ya ha buscado /Fish, puede cambiar rápidamente la búsqueda para ir al final de la partida a través de //e, que repite la última búsqueda, pero agrega el emodificador que ya se explicó.

Ingo Karkat
fuente
1
¡el número // e + es exactamente lo que estaba buscando! increíble.
Arkod
12

/ long-regexp1 \zs long-regexp2 / .. el cursor se detendrá en \ zs , consulte: ayuda \ zs

mosh
fuente
11

Una vez que tenga una selección visual, puede usar opara alternar la posición del cursor entre el inicio y el final del bloque seleccionado. Cuando la selección es en línea, esto alterna la línea posición , lo que significa que el cursor se mueve a la línea inicial y final de la selección, pero no al carácter inicial o final. Cuando la selección se basa en caracteres, el movimiento también se basa en caracteres.

También puede utilizar `<y`> para alternar el cursor entre el inicio y el final del bloque visual; sin embargo, esto afecta la selección en sí, por lo que se usa para restablecer o ajustar los límites de la selección.

Editar: Ah, pero para los aspectos destacados de la búsqueda esto no funcionará, porque oiniciará una inserción de línea. Supongo que el resaltado de búsqueda no es lo mismo que una selección visual, lo siento :)

kprobst
fuente
Yo tampoco lo sabía. Esto es genial para modificar el comienzo de una selección sin comenzar de nuevo. (por ejemplo, comenzó la selección una palabra demasiado pronto o demasiado tarde)
Timothée Boucher
8

La parte del "cursor al final del partido" de su pregunta ya está respondida.

Puede hacer :%s/Fish/FishTaco/c. Esto le da la oportunidad de confirmar o rechazar cada sustitución y omitir todo el asunto del "cursor al final del partido".

romainl
fuente
Sugerencia impresionante. Si ingreso 'y', solo realiza el reemplazo en el primero. ¿Cómo hago para confirmar para cada uno?
Jordan Parmer
1
Se va a la siguiente partido y espera para que escriba yo ny así sucesivamente hasta que no haya partidos que quedan. Para aceptar todas las sustituciones adicionales, escriba a, para rechazarlas, escriba q.
romainl
1
En realidad, me faltaba el gdespués de la final, /así que no continuaba en mi línea. Gracias por el consejo.
Jordan Parmer