Saltar a la próxima aparición de la palabra que acabo de cambiar

12

Si tengo lo siguiente:

function foo(bar) {
    return bar + 1;
}

Y solía cwcambiar el primero bara baz, ¿cómo salto a la siguiente coincidencia bar, para .poder hacer el mismo cambio?

No puedo usar *, porque eso busca la palabra actual debajo del cursor, y tontamente no busqué por barprimera vez, así nque no funcionará.

¿Hay una manera simple de buscar la próxima aparición de la palabra tal como estaba antes de cambiarla?

Yo no quiero hacer una búsqueda y reemplazo, ya sea porque hay otras ocurrencias de baren mi archivo que no desea cambiar, o porque sólo había dos instancias de bar, y me había olvidado :%s/bar/baz/antes de empezar y eso es demasiado mucho esfuerzo para cambiar la única instancia restante.

Roger Lipscombe
fuente
2
Eso no sigue totalmente el flujo de trabajo que describió, pero vim-oblicuo mejora la *búsqueda. Especialmente hace *que seleccione visualmente la palabra actual sin mover el cursor. Una vez que esté instalado, puede hacer *ciwpara poner la palabra antigua en el registro de búsqueda y cambiar la palabra. Entonces puedes usar ny ..
statox
Al presionar n, pasará a la siguiente aparición del último patrón buscado. ¿Por qué no intentaste eso?
SibiCoder
... porque no busqué llegar a la primera aparición, así nque no funcionará.
Roger Lipscombe

Respuestas:

14

El texto con el que acaba de cambiar cwse cortó en el registro sin nombre para que pueda reutilizarlo con:

/<C-r>"<CR>

para saltar a la siguiente aparición del texto cubierto por su último cambio.

romainl
fuente
5

Para extender fuera de romainl como un flujo de trabajo completo ...

Si está más interesado en realizar una edición de este tipo y luego se da cuenta de que necesita aplicar las mismas ediciones sobre un párrafo / función, puede usar los registros "y ..

En su ejemplo, puede realizar la edición inicial del argumento. Si ingresa al modo visual (usaría Visual Line solo para asegurarme de que selecciona todo correctamente) y luego aplica una búsqueda y reemplazo.

V]] - Línea visual, al final del párrafo / función.

  • : - Ya que estás en modo visual esto se convierte :'<,'>
  • s/ - Encontrar
  • CTRL+ "- último elemento de extracción / eliminación (barra en el ejemplo)
  • / - y reemplazar
  • CTRL+ .- última inserción (baz en el ejemplo)

Este patrón tarda un poco en acostumbrarse, ya que tiene que usarlo. La mayoría de las veces querrá simplemente aplicar la función de buscar y reemplazar a toda la función, incluido el argumento, pero es una buena manera de no realizar el antipatrón "Hacer el trabajo, darse cuenta de que debería haberlo hecho mejor, deshacer y rehacer correctamente."

jecxjo
fuente
2

Si no le importa presionar una combinación diferente cw, entonces creo que puede obtener lo que quiere fácilmente, definiendo un acceso directo. Lo que puedes hacer es colocar lo siguiente

nmap <leader>a "1yiw:let @/=@1^Mciw

en su .vimrcarchivo Tenga en cuenta que ^M es una captura de la tecla de retorno, y no los caracteres ^y M. Lo obtienes presionando Ctrl+ Ven modo de inserción seguido de Enter. Ahora, con esto definido, presionar <leader>ahará lo mismo que cw, pero ahora la palabra (antes del cambio) estará en su "último registro de búsqueda" (es decir, el /registro), así que presionar ndespués de haber realizado el cambio y regresado al modo normal lo llevará a la próxima aparición. Del mismo modo, presionar lo Nllevará a la ocurrencia anterior.

El acceso directo Por supuesto, puede elegir un acceso directo diferente que <leader>a, pero me parece que este es un acceso directo muy accesible. Personalmente, lo configuré <leader>para ,que solo necesite presionar ,seguido a, pero esto se debe a que no uso un teclado estadounidense, por lo que mi \está algo oculto (creo que \es el valor predeterminado <leader>).

Explicación La idea es realmente simple. Tira la palabra debajo del cursor al registro de búsqueda /y luego hazlo cw. Por lo tanto nmap <leader>a "/yciwera lo que yo buscaba, pero por desgracia no creo que se puede tire del mismo para el registro de búsqueda, por lo que la solución es dar un tirón a la palabra bajo el cursor al 1registro, a continuación, establecer el /registro igual a eso, y luego haces cw. Así "1yiwes la parte que tira de la palabra interna debajo del cursor al registro 1. Si no sabe acerca de las palabras internas, puede verificar :help iw. Luego, :let @/=@1sigue una captura de Enterpone los contenidos del 1registro en el /. En este punto nyNfunciona como la ocurrencia siguiente y anterior de la palabra debajo del cursor, y luego ciwse hace a para que la palabra debajo del cursor se elimine y Vim se ponga en modo de inserción.

palabra versus palabra interna Me acabo de dar cuenta de que asumí que querías la palabra completa debajo del cursor y no solo desde el punto del cursor y en adelante. Es por eso que usé en iwlugar de en wtodas partes. Si este no es el caso, entonces debe usar

nmap <leader>a "1yw:let @/=@1^Mcw

en lugar. Si el cursor está en la primera letra de la palabra, no hay diferencia.

descargo de responsabilidad Esta solución probablemente no funcionará bien si intenta usarlo en algo que contiene diferentes cosas de letras, por ejemplo haciendo que el soporte cursor en una \o sustituyendo iwpor iW, ib, iso ip, o algo (aunque no sé por qué lo haría quiere esta característica con oraciones completas)

Kristian
fuente