Como eu apenas dp ou faço apenas as linhas, não todo o bloco no diff do Vim?

28

Atualmente, estou usando a opção de menu "Split Diff by ..." da MacVim (Snapshot 64).

O arquivo é o my do Django da settings.pyversão 1.3.1 para um novo arquivo da versão 1.4.

Captura de tela

Eu conheço dois comandos básicos

  1. do para "obter" (e substituir) um bloco do outro lado.
  2. dp para "colocar" (e substituir) um bloco para o outro lado.

Mas esses dois comandos gravam o bloco inteiro, que no MacVim são os destaques roxos.

Se você olhar para o 2º bloco, poderá ver que nas linhas 2 e 3 há apenas 2 palavras diferentes: mysitee hobbes3. Eu só quero substituir por linha, não o bloco inteiro.

Então, o que há um comando para substituir do doe dppor linha em oposição a um bloco inteiro ou eu tenho que digitá-lo manualmente?

Pergunta do bônus : notei que, ao editar manualmente um bloco, perco o realce em roxo. Como atualizo o diff novamente para incluir os destaques sem reabrir o arquivo?

Por favor, tente manter as respostas gerais do Vim em oposição às específicas do MacVim.

hobbes3
fonte

Respostas:

30

Existem várias maneiras de fazer isso.

  1. Selecione o intervalo de linhas no buffer de destino que você deseja obter do buffer de origem e use :diffget. Por exemplo, você pode selecionar visualmente um intervalo de linhas com Ve digitar :diffget.
  2. Selecione o intervalo de linhas no buffer de origem que você deseja colocar no buffer de destino e use :diffput. Por exemplo, para colocar a linha atual no outro buffer, digite :.diffput.
  3. Use puxar e colocar. Selecione o intervalo de linhas no buffer de origem que você deseja copiar para o buffer de destino, puxe-as usando Y, mova o cursor para o buffer de destino e coloque-as onde deseja com elas pou Pexclua as linhas que não deseja.
  4. Arranque como acima, mas no buffer de destino, selecione visualmente o intervalo de linhas que deseja substituir (não necessariamente o mesmo número de linhas) e digite "0p. Isso usa o registro 0 (zero) que sempre contém o texto do arranco mais recente.

Para "atualizar" a tela para mostrar o realce adequado, execute :diffupdateou simplesmente :diffu. Às vezes isso não é suficiente e você precisa mover o cursor para a outra janela para concluir a atualização.

Você pode ler mais sobre a cópia de diferenças em

:help copy-diffs
garyjohn
fonte
3

Eu também queria modificar uma linha em um determinado momento durante um diff. Então eu criei um mapa simples e os coloquei no meu arquivo vimrc.

nnoremap <silent> <leader>dp V:diffput<cr>
nnoremap <silent> <leader>dg V:diffget<cr>

Você poderia usar fazer em vez de dg, mas estou mais acostumado a pensar em "difget" em vez de em [o] btain.

Para seu bônus, eu apenas uso outro mapa simples duas vezes:

nnoremap <silent> <leader>df :call DiffToggle()<CR>

Agora, o df irá desligar / ligar o modo diff, então eu apenas o desligo e ligo novamente.

E uma opção de bônus é adicionar

nmap <silent> <leader>du :wincmd w<cr>:normal u<cr>:wincmd w<cr>

Isso permitirá que você anule um erro de digitação ou alteração indesejada no outro arquivo / janela, porque: desfazer apenas u desfaz apenas uma alteração na janela atual.

lucky85dog
fonte