Como uso o vim como uma ferramenta diff?

102

Eu uso o vim como meu editor principal.

Eu também gostaria de usar o vim para diferenciar arquivos e modificá-los ao fazer o diff para corrigir alterações fáceis (em vez da maioria das técnicas diff, que são um ciclo de diff / fix / diff / fix).

Além disso, existem maneiras fáceis de integrar o vim nas ferramentas diff usadas pelas ferramentas / sites de controle de origem (estou pensando especificamente no git, mas tenho certeza de que outras pessoas estariam interessadas na integração com outras ferramentas / sites de controle de origem).

Martin York
fonte
1
você deve tentar o vim-fugitive, ele adiciona os comandos :Gdiffe os :Gvdiffdois comandos permitem ver a diferença lado a lado do buffer atual, se o buffer atual for gerenciado pelo git. Também heps-lo a resolver conflitos em um layout de três janela quando você tem conflitos de mesclagem em alguns arquivos
rbernabe
Eu tenho essa função simples no meu bashrc vd () { diff $@ > /dev/null ; if [[ $? -eq 1 ]] ; then ; vimdiff -c 'windo set syntax=off' $@ ; fi ; }e a invoco com vd file1 file2. Ele é usado diffpara determinar se os arquivos diferem e só é aberto vimdiffse for o caso. Caso contrário, eu fico na concha. Também desabilito o realce de sintaxe no Vim porque acho que é perturbador ao diferir. Funciona apenas com dois arquivos.
Rolf

Respostas:

122

O vim possui essa funcionalidade incorporada (com o sinalizador de linha de comando correto).

vim -d <file1> <file2>

Isso abre cada arquivo em uma exibição e destaca as diferenças.
Qualquer código idêntico está foldedausente, portanto, você não precisa procurar um código idêntico ou rolar por enormes pedaços de código idêntico.

Mas há também um aplicativo wrapper vimdiffque chama corretamente o vim com os sinalizadores corretos.

vimdiff source1.cpp source2.cpp

Se você estiver usando o git, poderá configurar uma ferramenta de comparação externa. Portanto, é fácil configurar o vimdiff para ser a ferramenta diff do git.

git config --global diff.tool vimdiff

Ao usar o vimdiff, você pode editar os lados e o destaque do diff mantém o ritmo para mostrar as diferenças.

Nota: Ao editar a partir de um diff git. Se você tentar editar a versão armazenada do repositório do arquivo, suas alterações serão descartadas quando você sair (o git não confia em você com o original, portanto, você está diferente de uma cópia tmp), mas pode editar a cópia local para o conteúdo do seu coração e salve-o sobre sua versão atual.

Alguns comandos básicos que são úteis em vimdiff

dp             diffput: puts changes under the cursor into the other file
                        making them identical (thus removing the diff).
do             diffget: (o => obtain). The change under the cursor is replaced
                        by the content of the other file making them identical.


]c             Jump to the next diff
[c             Jump to the previous diff

Outras configurações do vim que eu uso para trabalhar com destaque com o vimdiff

if &diff
    highlight! link DiffText MatchParen
endif

Isso desativa o destaque nos bits de código que são alterados. Portanto, a linha que é alterada é destacada para que eu possa identificar as alterações, mas o texto real que foi alterado se destaca na linha (pois não é realçado).

Martin York
fonte
Também lida com até 4 buffers, tornando-a excelente para comparar arquivos de configuração
Izkata
34
Você também pode usar o :diffthiscomando para iniciar um diff quando o Vim já estiver em execução.
Rich
11
E: diffoff para desativá-lo. Eu acho que um link para a documentação do vim seria benéfico: vimdoc.sourceforge.net/htmldoc/diff.html
Cody Poll
1
Para mim, mesmo depois git config --global diff.tool vimdiff, git diffainda mostra tudo como se eu não mudasse nada.
Hi-Angel
2
tentegit difftool
Martin York
13

Se você estiver editando um arquivo aberto e quiser compará-lo com outro arquivo sem fechar o atual:

Abra o novo arquivo em tela dividida:

Para divisão vertical:

:vs otherFile

ou divisão horizontal:

:split otherFile

Alterne os cursores para diferentes telas divididas:

ctrl+w ctrl+w

Invoque o "modo diff" no arquivo:

:diffthis

Alterne para outro arquivo e chame o "modo diff":

:diffthis

Para desativar o "modo diff":

:diffoff
irmão-bilo
fonte
5
Para evitar a alternância entre os buffers que você pode usar :windo diffthistambém
statox
4

Você pode colocar a configuração mencionada abaixo no .gitconfigarquivo encontrado no diretório %homepath%(ou %userprofile%) do usuário conectado no momento:

[diff]
    tool = vimdiff

Isso permitirá que a ferramenta git bash comece a usar o vimdiff como a ferramenta diff externa também.

RBT
fonte
2

Eu posso ver apenas três situações para usar o vim como um difftool. Eles são brevemente descritos abaixo:

  • Para o git difftool, coloque o seguinte em ~/.gitconfig:

    [core]
    editor = vim
    [diff]
    tool = vimdiff
    [merge]
    tool = vimdiff
    conflictstyle = diff3
    
  • Para abrir o vim como uma ferramenta diff para dois arquivos, você pode fazer o seguinte:

    vimdiff file1.ext file2.ext      # for vim
    nvim -d file1.ext file2.ext      # for neovim
    
  • Para obter uma visualização diferencial dos buffers atualmente ativos, ou seja, todos os buffers que possuem uma janela atribuída a eles na ficha de registro ativa no momento, você pode fazer o seguinte:

    :windo diffthis                " to get diff view
    :windo diffoff                 " to remove diff view
    

Para mais informações, veja :h diff

klaus
fonte
1

aqui está o que eu faço:

  • abra uma janela com o primeiro arquivo (ou o conteúdo do texto, se você estiver colando dados)
  • abra o próximo arquivo / janela usando :vnew(para ter as duas janelas lado a lado) ou :new(para ter as janelas em cima e em baixo). se você tiver um arquivo específico para abrir na segunda janela, poderá incluir o caminho como este::vnew /path/to/secondfile.txt
  • use F8 para alternar uma função personalizada que ativa e desativa o modo diff

aqui está a função personalizada que está no meu ~/.vimrc:

nmap <silent> <F8> :call ToggleDiff()<CR>
imap <silent> <F8> <C-O>:call ToggleDiff()<CR>
function ToggleDiff ()
    if (&diff)
        set nodiff noscrollbind
    else
        " enable diff options in both windows; balance the sizes, too
        wincmd =
        set diff scrollbind nowrap number
        wincmd w
        set diff scrollbind nowrap number
        wincmd w
    endif
endfunction
Kaan
fonte
você pode usar o comando :diffthise diffoff!assim não precisa definir todas as opções de diferenças (por exemplo, cursorbind também é definido por diffmode)
Christian Brabandt 17/04