Existe uma maneira de "pegar os dois" ao usar o Vim como ferramenta de mesclagem?


11

Também estou usando o Vim como uma combinação de três vias com o Git e, às vezes, preciso fazer alterações nas ramificações local e remota. kdiff3você pode fazer isso pressionando algumas teclas, existe uma maneira de fazer isso no Vim?

Respostas:


6

Não é exatamente o que você pediu, mas pode achar útil: Plug-in do Splice: um plug-in do Vim para resolver conflitos durante a fusão de três vias . Ele tem um ótimo screencast de demonstração no Vimeo .

Se você preferir o vimdiff padrão, poderá criar uma função para recuperar o número do buffer das janelas adjacentes e usá-los para ligar :diffgetduas vezes:

                            *: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")

Você poderia usar um mapeamento para atribuir uma chamada a essa função às teclas em que foi usado kdiff3.

Você pode encontrar mais informações sobre este vimcast .


3

yank e put podem funcionar sem plugins ou funções extras, embora seja, talvez, um pouco menos conveniente que dgoudp

Apenas copie os bits necessários dos buffers pai e cole-os no local correto no buffer mesclado. Isso também é útil se você deseja apenas parte de um bloco diff, e não a coisa toda.

Às vezes, você pode precisar forçar o Vim a atualizar o diferencial com :diffupdate.


1

Para combinar alterações das ramificações de destino e de mesclagem em um único comando:

Você pode simplesmente excluir as linhas com marcadores de conflito do Git. Os dois métodos a seguir excluirão todas as linhas que começam com:

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

Método 1: inserindo e executando manualmente um comando

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

Método 2: implementando um comando definido pelo usuário

"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 e diffput escolherão apenas um ramo ou outro. Portanto, a única solução real, além da mencionada acima, é puxar e colar manualmente os dois arquivos na cópia de trabalho.


Dê uma razão se você está indo para o voto negativo.
User3751385

É tudo o que faço - basta excluir os marcadores.
Aaron McMillin
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.