Pegar varias veces

93

¿Cuál es la mejor manera de reemplazar varias líneas con el contenido del portapapeles?

El problema que tengo es que cuando tiro de una línea y la pego sobre otra línea, el "tirón" se reemplaza con la línea que acabo de reemplazar. Ahora, si quiero reemplazar otra línea con la misma línea, tengo que volver a subir y tirar de ella nuevamente.

Tiene que haber una mejor manera de hacer esto.

jwerre
fuente

Respuestas:

108

Tengo esto en mi .vimrc:

xnoremap p pgvy

(nota: esto solo funcionará con el registro predeterminado, pero esta asignación es fácil de recordar). Sería posible escribir una versión más elaborada. Además, aún puede usar P para obtener el comportamiento anterior.

Benoit
fuente
28
Inteligente. 'p' para pegar, 'gv' para volver a seleccionar lo que se seleccionó originalmente. 'y' para copiarlo de nuevo.
Amjith
@SibbsGambling, ¿probablemente estás usando una versión anterior a Vim 7? Luego, actualice Vim o use v en lugar de x ( vnoremap). El archivo de ayuda de Vim version7.txtindica que xmap y smap aparecieron en esa versión.
Benoit
1
@Benoit Hmm, tengo 7.4.52, pero ni xnoremapni vnoremapfunciona
Sibbs Gambling
8
¿Por qué no es este el comportamiento predeterminado?
Seth
27

"0debe tener el contenido de su tirón. Es un poco más tedioso de escribir, pero "0pdebe hacer lo que quiera.

Alternativamente, no seleccione y reemplace las líneas antiguas al principio. Si encuentra esas líneas con una búsqueda, simplemente presione n.una y otra vez (después de una inicial p), luego, cuando estén todas pegadas, hágalo nddseguido de tantas n.s como sea necesario.

El cambio mental más grande que tuve que hacer al pasar a Vim es descubrir cómo aplicar las ediciones de grupo de forma secuencial. Es decir, en lugar de hacer un montón de ediciones en una línea y luego hacer un montón de las mismas ediciones en otra línea, haré la primera edición en un montón de líneas (usando .con gran efecto), luego la segunda edición en un montón de líneas, etc. Alternativamente, el uso de macros puede ayudar ya que son fantásticas, pero a veces un poco más tediosas para trabajar correctamente con cambios "complejos".

dash-tom-bang
fuente
2
suena como un lugar donde la expresión regular con :%s/.../.../gccomandos de tipo de confirmación podría estar más cerca de lo que desea
Milimetric
@Milimetric +1 no sabía que podías confirmar así.
1
Votar a favor porque las macros pueden hacer que esto no sea un problema. Simplemente haga la edición una vez, y puede hacer algo como 5@m(para una macro llamada m)
skatenerd
Gracias por la gran explicación. Ahora lo uso xnoremap p "0pen mi ~ / .vimrc
nexayq
13

A menudo uso otro registro, copio la línea que necesita en un registro con nombre "ayy luego la pego desde allí"ap

Facundo Casco
fuente
11

Cuando pega sobre una selección en Vim, reemplazará el registro predeterminado con el contenido de la selección. Si pegar sobre una selección está borrando el contenido del registro del portapapeles, es muy probable que tenga la siguiente línea en su .vimrc

set clipboard=unnamed

Una opción es eliminar eso y usar el registro explícito del portapapeles "+

Otra opción es usar cualquiera de los otros registros nombrados explícitamente (az). Después de la primera pasta, tire de la línea hacia atrás, "cpor ejemplo, y luego use "cppara pegar de ahí en adelante.

JaredPar
fuente
En realidad, el valor predeterminado (aquí, en Ubuntu) era clipboard = autoselect; aún así, gracias por la respuesta más elegante hasta ahora.
Tobu
8

use npwhere nes la cantidad de tiempo que desea pegar las líneas, por ejemplo 3p, pegará 3 líneas.

demasiadopagar
fuente
7
No funciona cuando desea pegar la misma línea sobre líneas no contiguas.
Tobu
@Tobu, pero responde al título de esta pregunta '¿cómo se pega varias veces?'
icc97
6

En lugar de usar copiar / pegar, a menudo es mejor usar un comando de objeto de texto como ciwpara cambiar la palabra interna. Este método tiene la ventaja de ser fácilmente repetible usando el .comando de repetición.

  1. yiw Tire de la palabra interna (copie la palabra debajo del cursor, diga "primero").
  2. ... Mueva el cursor a otra palabra (diga "segundo").
  3. ciw<C-r>0 Cambie "segundo", reemplazándolo con "primero" (es Ctrl-R).
  4. ... Mueva el cursor a otra palabra (diga "tercera").
  5. . Cambie "tercero", reemplazándolo por "primero".
jack guan
fuente
1
ciw<C-r>0no funciona en mi caso. ciwcambia al modo de inserción donde se <C-r>vuelve inútil. ¿Existe una explicación fácil para esto? ¿Podría eso tener que ver con el editor de texto (no estoy usando pur VIM sino enlaces de teclado VIM en RStudio)
Bushroot
@Bushroot <C-r>está diseñado para usarse en modo de inserción, ya que es la forma de pegar desde un registro sin salir del modo de inserción, es decir, en Vim; No estoy familiarizado con RStudio, pero supongo que tiene razón y no han implementado este enlace de teclas en particular.
insectean
@Sean H: Sí. No implementaron la vinculación de claves. Funciona bien en VIM e incluso con enlaces VIM en otros programas (por ejemplo, Visual Studio Code).
Bushroot