Qual é a maneira recomendada de copiar alterações com o vimdiff?

117

Ao comparar arquivos e atualizar um repositório de código-fonte, eu gosto de usar o vimdiff. Para copiar as alterações feitas de um arquivo para outro, geralmente uso uma sequência 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)

O Vim, sendo o mestre dos atalhos de teclado, certamente deve ter uma maneira mais fácil de executar a mesma tarefa. Existe um? O que você usa para atualizar manualmente as alterações no código-fonte?

Alex Leach
fonte
2
Obrigado por colocar meu vago senso de "isso não é o que deveria ser" em uma pergunta significativa. A resposta apresentada é algo que eu deveria ter aprendido há muito tempo.
Caleb #
1
As melhores respostas para sua pergunta estão aqui: stackoverflow.com/questions/5288875/…
erik

Respostas:

181

do(diff obtém) e dp(dif coloca) é o que você precisa. Aqui está uma pequena lista de outros comandos úteis do modo normal neste 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 funcionam doe dpse você estiver em um bloco ou apenas uma linha abaixo de um bloco no modo normal, mas não no modo visual. Ao selecionar linhas de texto no modo visual, você deve usar os comandos normais

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

Veja também :h copy-diffs.

:diffupdate irá verificar novamente os arquivos em busca de alterações.

Marco
fonte
4
Verdadeiro. Eu achei bastante confuso inicialmente, pois blocos inteiros (contíguos) são copiados. Que, junto com o esconderijo automático de linhas idênticas no modo diff, me vi pensando "O que diabos aconteceu?", Antes de verificar três vezes cada movimento, nos dois painéis. Digamos que você tenha alterado o recuo em um dos arquivos; então imagino que tudo será mudado. Para um controle mais refinado (ie Visual selecção), descobri que os comandos completos :[range]diffgete :[range]diffputsão necessários.
Alex Leach
8
Você pode usar o modo visual junto com diffgete diffput: ① Entre no modo visual e marque alguns textos / linhas. Type Digite :diffputpara enviar as linhas selecionadas para o outro arquivo ou :diffgetpara obter as linhas selecionadas do outro arquivo.
quer
6
Oi, alguém sabe se existe um equivalente a "fazer" (obter diferença) para APENAS uma linha? Digamos que você tenha um bloco de códigos (mais de uma linha) diferentes, "faça" com o cursor em qualquer linha desses códigos, pois apenas a linha abaixo desses códigos obterá diferença para todo o bloco de códigos --- Mas Eu só quero obter diferença para uma linha. Toda vez que eu tenho que selecionar visualmente esta linha, seguido por "diffget", um pouco entediante ...
wiswit
12
É importante observar que o comando desfazer funcionará apenas no buffer que foi alterado; portanto, se você usar dpe mudar de idéia, precisará mudar para o outro buffer para desfazer.
Random832
1
@ wiswit: Vpara selecionar a linha inteira e, em seguida, dotrabalha para copiar sobre uma linha específica no vim atual (8.0), para o que valer a pena.
dannysauer 19/04