¿Cuál es la forma recomendada de copiar cambios con vimdiff?

117

Al comparar archivos y actualizar un repositorio de código fuente, me gusta usar vimdiff. Para copiar los cambios realizados de un archivo a otro, generalmente uso una secuencia de teclas como esta:

Shift + V (select line)
k or j; { or }; Up or down arrow keys (select more lines)
y  (copy selected lines)
Ctrl + w, left/right arrow (move to other pane)
p (paste lines)

Vim, siendo el maestro de los atajos de teclado, seguramente debería tener una forma más fácil de realizar esta misma tarea. ¿Hay uno? ¿Qué utiliza para actualizar manualmente los cambios en el código fuente?

Alex Leach
fuente
2
Gracias por poner mi vago sentido de "esto no es lo que debería ser" en una pregunta significativa. La respuesta obtenida es algo que debería haber aprendido hace mucho tiempo.
Caleb
1
Las mejores respuestas para su pregunta están aquí: stackoverflow.com/questions/5288875/…
erik

Respuestas:

181

do(diff get) y dp(diff put) es lo que necesitas. Aquí hay una pequeña lista de otros comandos útiles de modo normal en este contexto.

]c               - advance to the next block with differences
[c               - reverse search for the previous block with differences
do (diff obtain) - bring changes from the other file to the current file
dp (diff put)    - send changes from the current file to the other file
zo               - unfold/unhide text
zc               - refold/rehide text
zr               - unfold both files completely
zm               - fold both files completely

NOTA:
Ambos doy dpfuncionan si está en un bloque o solo una línea debajo de un bloque en modo normal pero no en modo visual. Al seleccionar líneas de texto en modo visual, debe usar los comandos normales

  • :'<,'>diffget y
  • :'<,'>diffput.

Ver también :h copy-diffs.

:diffupdate volverá a escanear los archivos en busca de cambios.

Marco
fuente
44
Cierto. Al principio me pareció bastante confuso, ya que se copian bloques enteros (contiguos). Eso, junto con la ocultación automática de líneas idénticas del modo diff, me encontré pensando "¿Qué demonios acaba de pasar?", Antes de verificar tres veces cada movimiento, en ambos paneles. Digamos que ha cambiado la sangría en uno de los archivos; entonces me imagino que todo se trasladará. Para el control de grano más fino (es decir, selección visual), he encontrado que los comandos completos :[range]diffgety :[range]diffputson necesarios.
Alex Leach
8
Puede usar el modo visual junto con diffgety diffput: ① Ingrese al modo visual y marque algunos textos / líneas. ② Luego escriba :diffputpara empujar las líneas seleccionadas al otro archivo o :diffgetpara obtener las líneas seleccionadas del otro archivo.
erik
66
Hola, ¿alguien sabe si hay un equivalente de "hacer" (obtener la diferencia) para SOLO una línea? Digamos que tiene un bloque de códigos (más de una línea) que son diferentes, "hacer" con el cursor en cualquier línea de estos códigos, ya que solo la línea debajo de estos códigos obtendrá la diferencia para todo el bloque de código --- Pero Solo quiero obtener la diferencia para UNA línea. Cada vez que tengo que seleccionar visualmente esta línea, seguido de "diffget", un poco tedioso ...
wiswit
12
Es importante tener en cuenta que el comando deshacer solo funcionará en el búfer que se modificó, por lo que si usa dpy cambia de opinión, debe cambiar al otro búfer para deshacer.
Random832
1
@wiswit: Vpara seleccionar la línea completa, luego dotrabaja para copiar sobre una línea específica en vim actual (8.0), por lo que valga.
dannysauer