Cómo reemplazar el texto interno con texto extraído

17

Un patrón de edición con el que me encuentro con frecuencia es el siguiente: quiero tirar de un texto dentro de comillas o corchetes, y reemplazar ese texto dentro de otro par de comillas / corchetes.

Por ejemplo, si quiero copiar el nombre de la clase foo bary pegarlo en otro lugar:

<span class="foo bar">

<div class="this-should-be-replaced-with-foo-and-bar">

Lo que sé es esto: si me muevo dentro de la clase del lapso, uso yi"para tirar del texto dentro de las comillas.

Ahora tengo esto en mi registro, por lo que debería poder reemplazar el contenido de la clase del div con él. Pero no puedo encontrar una manera práctica de hacer esto.

Si uso ciwesto termina sobrescribiendo mi registro con contenido para cambiar, por lo que pierdo mi texto arrancado.

Lo mejor que se me ocurre es pasar a la primera cita de la clase de div, presionar py luego eliminar a la siguiente cita con dt".

Por lo general, arruino mi posición, y la pego en algún lugar dentro de las comillas que combinan las dos cadenas, y está arruinando las cosas.

Espero que haya alguna forma de hacer una combinación de "reemplazar el texto interno con mi contenido extraído, por favor" para facilitar esto.

jurgenb
fuente

Respuestas:

19

Puedes usar vi"pcuando estás dentro "". Esto puede reemplazar el texto en el registro de extracción, por lo que es importante cuando desea utilizar el texto original extraído más de una vez.

EDITAR : Información adicional del comentario de Octaviour sobre cómo volverlo a usar más de una vez:

Para hacer eso, me tiraría a un registro con nombre, que hace los dos comandos: "ayi"y vi""apsi usa el registro a.

Grodzik
fuente
2
Explicaré esta solución. Primero tira del texto que desea copiar. Luego va al lugar que desea pegar, selecciona visualmente usando vi ". Un comando de pegar ahora colocará simultáneamente el contenido del registro sin nombre en el cursor y eliminará el texto seleccionado. Por lo tanto, vi" p logra exactamente lo que desea, pero reemplaza el contenido del registro sin nombre, evitando que pegue el mismo texto dos veces. Para hacer eso, me tiraría a un registro con nombre, que hace los dos comandos: "ayi" y vi "" ap si usa el registro a.
Octavio el
Gracias por elaborar Ayuda a deletrear las cosas con movimientos vim, hace que sea más fácil recordarlo después. Todavía no es tan fácil como esperaba que fuera, pero tiene sentido de una manera vim. Sin embargo, usar el comando punto para que se repita y reemplace rápidamente por segunda vez no parece funcionar. Esperaba que fuera un atajo. :)
jurgenb
11

Puede usar el registro numerado. Primero tira "foo-bar" con yi", que llenará el "0registro, ver :h "0. Luego haga ci"<c-r>0para reemplazar con el contenido del registro 0.

Ver :h i_CTRL-Rpara una descripción de la última parte.

Karl Yngve Lervåg
fuente
2
¿Por qué no simplemente tirarlo en el registro sin nombre ( yi") y pegarlo desde el registro 0donde se almacena después de eliminar el texto para cambiar ( ci"<c-r>0)? En términos de vimgolf ganas 2 pulsaciones de teclas y no te metas con tus registros.
statox
tan pronto como presiono 'a' termino en modo de edición, esto no se copia en un registro
jurgenb
@ n3wjack Eso es probablemente porque no presionaste CTRL+rantes a, eso es lo que <c-r>significa.
statox
1
@ KarlYngveLervåg En realidad ciw, coloca el texto eliminado en el registro sin nombre, pero los registros se desplazan, es por eso que debe usar en <c-r>0lugar de <c-r>". Ver :h quote_number.
statox
1
Yo pensaría, más específicamente, que el punto aquí no es sobre el registro sin nombre, sino sobre el registro numerado. El "0registro sólo es rica por el comando tirón y no será perturbado por ejemplo c.
Karl Yngve Lervåg el
9

Aquí hay otra solución. No es el mejor en términos de Vimgolf, pero usa el registro de agujeros negros:

Una vez que esté en la foo barcuerda, puede tirar de ella normalmente yi".

Luego dentro de los corchetes para cambiar: "_di"P

Cual es:

"_       We will use the black hole register
di"      Delete the inner brackets and put the deleted text in the black hole register
P        Put the previously yanked text

La ventaja del registro de agujeros negros es que no dañará los demás registros. Ver :h quote_para más detalles.

(Tenga en cuenta que esta respuesta solo está aquí para hablar sobre el registro de apagón. Personalmente uso la selección visual como lo sugiere @grodzik).

statox
fuente
Creo que necesitas una mayúscula Ppara eso. Cuando coloque di"el cursor sobre las últimas citas p, pegará después, donde Ppegará antes de la posición actual.
jecxjo
@jecxjo Así es, edité mi respuesta, ¡gracias!
statox
8

Necesito esto con tanta frecuencia, escribí un complemento para simplificar y permitir la velocidad máxima: Reemplazar con registro .

Este complemento ofrece un grcomando dos en uno que reemplaza el texto cubierto por un {movimiento} / objeto de texto, líneas completas o la selección actual con el contenido de un registro; el texto antiguo se elimina en el registro de agujeros negros, es decir, se ha ido. Maneja de manera transparente muchos casos de esquina y permite una repetición rápida a través del .comando estándar . Si no te gusta, su página tiene enlaces a alternativas.

Ingo Karkat
fuente
¡Excelente! Esto debería ser vainilla vim.
Philipp Moers el