¿Cómo puedo pegar (sobrescribir) con vim?

31

En vimuso yyy ptodo el tiempo para tirar y pegar líneas. Sin embargo, si quiero reemplazar una línea en varios lugares en el archivo, no puedo usar yy p dd pporque dd elimina la línea en el portapapeles / registro. Si bien probablemente debería saber cómo usar mejor los registros, creo que probablemente haya una forma de preemplazar la línea actual.

cwd
fuente

Respuestas:

27

Por defecto, los comandos de pegar usan el "registro ("sin nombre") . Efectivamente, cualquier comando que escriba en un registro también escribe en el registro sin nombre, por lo que los cambios, las eliminaciones y los cambios lo afectan. Esta es la razón por la cual su secuencia yank-delete-paste pega el texto eliminado en lugar del texto eliminado.

El 0registro puede ayudar aquí. Cualquier comando de extracción que no especifique un registro coloca el texto extraído en el registro 0(además de "). No se ve afectado por las operaciones de eliminación o cambio, por lo que puede usarlo para pegar una línea arrancada varias veces, incluso si realiza eliminaciones o cambios intermedios.

  1. yy: Los registros 0y "ambos ahora tienen la línea arrancada.
  2. Mover a una línea para reemplazar.
  3. dd: Registrarse "ahora tiene la línea eliminada, pero registrarse 0todavía tiene la línea arrancada.
    "0P: Pegue la línea originalmente arrancada del registro 0.
  4. Mover a la siguiente línea para reemplazar.
  5. dd"0P (lo mismo que arriba)

(Debido a la forma en que funciona el posicionamiento del cursor al reemplazar la última línea de un búfer, querrá usar en "0plugar de "0P).

Esto está muy cerca de la respuesta de Bruce Ediger , excepto que no es necesario especificar un registro cuando se tira inicialmente. Sin embargo, usar uno o más registros con nombre puede ser muy útil si necesita (por ejemplo) reemplazar algunas líneas con AAA, pero otras líneas con BBB(poner AAAen el registro ay BBBen el registro b(o dejar uno de ellos en el registro 0), luego pegarlos en consecuencia )

También puede pegar desde 0el modo visual de línea sabio ( V) para guardar una combinación de teclas: V"0p.

Si no le gusta tener que escribir "0, puede encontrar una asignación más conveniente:

noremap <Leader>p "0p
noremap <Leader>P "0P
vnoremap <Leader>p "0p

Un enfoque alternativo es eliminar el _registro ("agujero negro") . Cuando lo borra, el "registro no se ve afectado, por lo que su secuencia yank-delete-paste todavía puede pegar el texto arrancado del registro sin nombre.

  1. yy: Regístrese 0y "ambos ahora tienen la línea arrancada.
  2. "_dd: Sin cambios en los registros.
    P: Pegue el texto originalmente arrancado del registro ".

Nuevamente, puede encontrar una asignación más conveniente:

noremap <Leader>d "_d
Chris Johnsen
fuente
2
O, tl; dr, simplemente use yy(mover a la línea para ser reemplazado) S<C-r>0<Esc>. Tiene la ventaja de ser repetible con el .comando.
Comodín el
11

Parece que Kevin tiene una respuesta bastante buena, pero si quieres ver cada línea que eliminas y reemplazarla, existe una solución ligeramente diferente.

1. Find line to copy in some select number of places.
2. Put cursor on it.
3. "ayy copies that line into register 'a'.
4. Find line to replace. Put cursor on it.
5. dd deletes that line. "aP inserts the copied line above where the cursor now lies.
6. Repeat steps 4 and 5.

Este tipo de receta le permite utilizar la coincidencia de patrones para buscar líneas para eliminar y reemplazar, y puede volver al inicio del archivo (1G) y buscar hacia adelante tantas veces como lo desee. Si tengo 2 o más líneas para reunir y colocar repetidamente, utilizo "ayypara la primera línea, "byypara la segunda, "cyypara la tercera, y así sucesivamente. Hice un hábito (que reduce la generalidad de la receta) para disminuir la carga mental sobre mí.

Bruce Ediger
fuente
Muy agradable. Entonces, si lo uso "ayyy luego dd, ddno reemplazará lo que está dentro a, pero si plo escribo pegará lo que acaba de eliminar usando dd. Y si quisiera reemplazar lo que está adentro "ayycon lo que estoy borrando, entonces usaría "add, ¿es así?
cwd
"ayy copia una línea en el registro 'a'." dd "corta una línea en un registro predeterminado, no 'a'. 'p' pega el registro predeterminado, correcto. Y sí," add corta una línea en el registro 'a' , que reemplazaría el contenido del "comando ayy."
Bruce Ediger
5

Hay un par de formas de hacer esto :s, dependiendo de la cantidad de escritura que desee hacer. La forma más fácil es una simple búsqueda y reemplazo:

:%s/find this line/replace with this/

El %buscará todo el archivo y reemplazará todas las ocurrencias.

Si eso es escribir demasiado, puede tirar de la cadena de destino ( yy) y usar el "registro (predeterminado), insertándolo con Ctrl+r ":

:%s/<ctrl+r><">/replacement/

O, si tiene una copia de la cadena de reemplazo, puede tirar de los dos en registros separados con "ayyy "byypara tirar en los registros ay b, respectivamente (puede usar cualquier letra para sus registros). Luego use Ctrl+r ay Ctrl+r bpara pegarlos en los campos de búsqueda y reemplazo.

No para superar a Bruce, pero si desea verificar las líneas antes de reemplazarlas, simplemente agregue la copción:

:%s/find this line/replace with this/c
Kevin
fuente
2

Puede usar Vpara resaltar la línea que desea reemplazar en modo visual y luego presionar pppara pegar sobre esa línea.

Esto solo agrega una pulsación de tecla, por lo que parece una solución bastante buena.

mouche
fuente
Esto no funciona: después del pegado, el portapapeles contiene el texto marcado por elV
daniel kullmann
Solo uno p.
Aaron Thoma
2

Utilizo el ccomando "cambiar" con bastante frecuencia para este tipo de cosas, combinado con la búsqueda regular. Puede buscar en el archivo cada línea / fragmento de texto que le interese y luego usar n.comandos consecutivos ( npara el siguiente y luego .para repetir el último cambio).

/^hello- Encuentra la línea que comienza con hola;
c$goodbye- cambiar la línea a adiós;
n.- repita buscar, repetir cambio

Si desea cambiar la línea a una que ya está en el archivo, puede copiarla en su búfer de entrada (suponiendo que su GUI lo permita) y luego pegarla para obtener el contenido del primer comando de cambio.

Como con todas las cosas vi, es una buena idea tener muchas opciones en tu bolsillo, dependiendo de qué tipo de edición quieras hacer.

rghome
fuente