¿Hay alguna manera de "tomar ambos" cuando se utiliza Vim como herramienta de combinación?

11

Estoy usando Vim como una combinación de 3 vías también con Git y, a veces, necesito tomar cambios de ramas locales y remotas. kdiff3puede hacer esto con un par de pulsaciones de teclas, ¿hay alguna manera de hacerlo en Vim?

sinapsis
fuente

Respuestas:

6

No es exactamente lo que solicitó, pero puede resultarle útil: complemento de empalme: un complemento de Vim para resolver conflictos durante la fusión a tres bandas . Tiene un bonito screencast de demostración en Vimeo .

Si va a seguir con el vimdiff predeterminado, puede crear una función para recuperar el número de búfer para las ventanas circundantes y usarlas para llamar :diffgetdos veces:

                            *:diffg* *:diffget*
:[range]diffg[et] [bufspec]
        Modify the current buffer to undo difference with another
        buffer.  If [bufspec] is given, that buffer is used.  If
        [bufspec] refers to the current buffer then nothing happens.
        Otherwise this only works if there is one other buffer in diff

(...)

The [bufspec] argument above can be a buffer number, a pattern for a buffer
name or a part of a buffer name.  Examples:

    :diffget        Use the other buffer which is in diff mode
    :diffget 3      Use buffer 3
    :diffget v2     Use the buffer which matches "v2" and is in
                diff mode (e.g., "file.c.v2")

Podría usar una asignación para asignar una llamada a esta función a las teclas en las que se utilizó kdiff3.

Puede encontrar más información sobre este vimcast .

mMontu
fuente
3

yank y put pueden funcionar sin complementos ni funciones adicionales, aunque es, quizás, un poco menos conveniente que dgodp

Simplemente copie los bits necesarios de las memorias intermedias principales y péguelos en el lugar correcto en la memoria intermedia combinada. Esto también es útil si desea solo una parte de un bloque diff, en lugar de todo.

Es posible que, a veces, necesite forzar a Vim a actualizar el resaltado de diferencias con :diffupdate.

8bittree
fuente
1

Para combinar cambios de las ramas de destino y fusión en un solo comando:

Simplemente puede eliminar las líneas con marcadores de conflicto Git. Los siguientes dos métodos eliminarán todas las líneas que comienzan con:

<<<<<<<
=======
>>>>>>>

Método 1: ingresar y ejecutar manualmente un comando

:g/^<\{7}\|^|\{7}\|^=\{7}\|^>\{7}/d

Método 2: Implementar un comando definido por el usuario

"Delete all Git conflict markers
"Creates the command :GremoveConflictMarkers
function! RemoveConflictMarkers() range
  echom a:firstline.'-'.a:lastline
  execute a:firstline.','.a:lastline . ' g/^<\{7}\|^|\{7}\|^=\{7}\|^>\{7}/d'
endfunction
"-range=% default is whole file
command! -range=% GremoveConflictMarkers <line1>,<line2>call RemoveConflictMarkers()

Vim diffget y diffput solo elegirán una rama u otra. Por lo tanto, la única solución real que no sea la anterior es tirar y pegar manualmente de ambos archivos en la copia de trabajo.

usuario3751385
fuente
Da una razón si vas a votar en contra.
user3751385
Esto es todo lo que hago: simplemente elimine los marcadores.
Aaron McMillin