Como posso dp ou fazer apenas as linhas, não o bloco inteiro no Vim diff?

25

Eu estou usando o MacVim (Instantâneo 64) "Diff Split por ..." opção de menu.

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

Eu conheço dois comandos básicos

  1. d o para "obter" (e substituir) um bloco do outro lado.
  2. d p 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 em roxo.

Se você observar o segundo bloco, poderá ver que as linhas 2 e 3 têm apenas duas palavras diferentes: mysite e hobbes3 . Eu só quero substituir por linha não o bloco inteiro.

Então, o que é um comando para substituir d o e d p por linha como oposto a um bloco inteiro ou eu tenho que digitá-lo manualmente?

Pergunta de bônus : notei que, depois que eu edito manualmente um bloco, perco o realce roxo. Como faço para "atualizar" o diff novamente para incluir os destaques sem reabrir o arquivo?

Por favor, tente manter as respostas Vim-general como se opor ao MacVim-specific.

    
por hobbes3 24.03.2012 / 17:55

2 respostas

27

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 V e, em seguida, 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 yank e coloque. Selecione o intervalo de linhas no buffer de origem que você deseja copiar no buffer de destino, escolha-as usando Y , mova o cursor para o buffer de destino e coloque-as onde desejar com p ou P . exclua as linhas que você 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 . Que usa o registrador 0 (zero), que sempre contém o texto do yank mais recente.

Para "atualizar" a exibição para mostrar o realce adequado, execute :diffupdate ou 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 como copiar os diffs em

:help copy-diffs
    
por 24.03.2012 / 19:02
3

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

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

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

Para o seu bônus, basta usar outro mapa simples duas vezes:

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

Agora, o df desligará / ligará o modo diff, então eu o desliguei e liguei 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ê desfaça um erro de digitação ou uma alteração indesejada no outro arquivo / janela, porque: desfazer só vc vai desfazer uma mudança na janela atual.

    
por 03.09.2014 / 22:58