Comment utiliser vim comme outil de différenciation?


102

J'utilise vim comme principal éditeur.

Je voudrais aussi utiliser vim pour diff fichiers et modifier les fichiers tout en faisant le diff pour corriger les changements faciles (plutôt que la plupart des techniques diff qui sont un cycle de diff / fix / diff / fix).

En outre, il existe des moyens simples d'intégrer vim aux outils de diff utilisés par les outils / sites de contrôle de code source (je pense particulièrement à git, mais je suis sûr que d'autres personnes seraient intéressées par l'intégration à d'autres outils / sites de contrôle de code source).


1
vous devriez essayer vim-fugitive, il ajoute les commandes :Gdiffet les :Gvdiffdeux commandes vous permettent de voir le diff côte à côte du tampon actuel si votre tampon actuel est géré par git. Il vous aide également à résoudre les conflits dans une disposition à trois fenêtres lorsque des conflits de fusion se
produisent

J'ai cette fonction simple dans mon bashrc vd () { diff $@ > /dev/null ; if [[ $? -eq 1 ]] ; then ; vimdiff -c 'windo set syntax=off' $@ ; fi ; }et je l'invoque avec vd file1 file2. Il utilise diffpour déterminer si les fichiers diffèrent et ne s'ouvre vimdiffque si c'est le cas. Sinon, je reste dans la coquille. Je désactive également la coloration syntaxique dans Vim car je trouve cela distrayant de différer. Ne fonctionne qu'avec deux fichiers.
Rolf

Réponses:


122

vim a cette fonctionnalité intégrée (avec le bon indicateur de ligne de commande).

vim -d <file1> <file2>

Cela ouvre chaque fichier dans une vue et met en évidence les différences.
Tout code identique est foldedabsent, vous n’avez donc pas besoin de regarder un code identique ou de faire défiler de gros morceaux de code identique.

Mais il existe également une application wrapper vimdiffqui appelle correctement vim avec les indicateurs corrects.

vimdiff source1.cpp source2.cpp

Si vous utilisez git, vous pouvez configurer un outil de différenciation externe. Il est donc facile de configurer vimdiff pour qu’il soit l’outil de diff de git.

git config --global diff.tool vimdiff

Lorsque vous utilisez vimdiff, vous pouvez modifier l’un ou l’autre des côtés et la surbrillance des différences suit le rythme pour montrer les différences.

Remarque: lors de l'édition à partir d'un diff git. Si vous essayez d’éditer la version stockée du fichier dans le référentiel, vos modifications seront ignorées lorsque vous quitterez (git ne vous fait pas confiance avec l’original, ce qui vous différencie d’une copie tmp), mais vous pouvez éditer la copie locale vers votre contenu et votre contenu. enregistrez-le sur votre version actuelle.

Quelques commandes de base utiles dans 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

Autres paramètres vim que j'utilise pour surligner avec vimdiff

if &diff
    highlight! link DiffText MatchParen
endif

Cela désactive la mise en évidence des bits de code modifiés. Ainsi, la ligne modifiée est mise en surbrillance afin que je puisse repérer les modifications, mais le texte réellement modifié se distingue de la ligne (car il n'est pas mis en surbrillance).



34
Vous pouvez également utiliser la :diffthiscommande pour lancer un diff lorsque Vim est déjà en cours d'exécution.
Rich

11
Et: diffoff pour l'éteindre. Je pense qu'un lien vers la documentation de vim serait bénéfique: vimdoc.sourceforge.net/htmldoc/diff.html
Cody Poll

1
Pour moi, même après git config --global diff.tool vimdiff, git diffmontre toujours tout comme si je ne change rien.
Hi-Angel le

2
essayezgit difftool
Martin York

13

Si vous modifiez un fichier ouvert et souhaitez le comparer à un autre fichier sans fermer le fichier actuel:

Ouvrez le nouveau fichier en écran partagé:

Pour la scission verticale:

:vs otherFile

ou scission horizontale:

:split otherFile

Basculez les curseurs sur différents écrans partagés:

ctrl+w ctrl+w

Invoquer "mode diff" dans le fichier:

:diffthis

Basculez vers un autre fichier et appelez le "mode diff":

:diffthis

Pour désactiver le "mode Diff":

:diffoff

5
Pour éviter de changer de tampon, vous pouvez :windo diffthisaussi utiliser
statox

4

Vous pouvez placer ci-dessous le paramètre mentionné dans le .gitconfigfichier situé dans le répertoire %homepath%(ou %userprofile%) de l'utilisateur actuellement connecté:

[diff]
    tool = vimdiff

Cela permettra à l'outil git bash de commencer à utiliser vimdiff comme outil de diff externe également.



2

Je ne vois que trois situations pour utiliser vim en tant que difftool. Ils sont brièvement décrits ci-dessous:

  • Pour git difftool, mettez ce qui suit dans votre ~/.gitconfig:

    [core]
    editor = vim
    [diff]
    tool = vimdiff
    [merge]
    tool = vimdiff
    conflictstyle = diff3
    
  • Pour ouvrir vim en tant qu'outil de différenciation pour deux fichiers, vous pouvez procéder comme suit:

    vimdiff file1.ext file2.ext      # for vim
    nvim -d file1.ext file2.ext      # for neovim
    
  • Pour obtenir une vue diff des tampons actuellement actifs, c'est-à-dire tous les tampons auxquels une fenêtre leur a été affectée dans la page à onglet actuellement active, vous pouvez procéder comme suit:

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

Pour plus d'informations, voir :h diff


1

voici ce que je fais:

  • ouvre une fenêtre avec le premier fichier (ou le contenu du texte si vous collez des données)
  • ouvrez le fichier / la fenêtre suivante en utilisant :vnew(pour avoir les deux fenêtres côte à côte) ou :new(pour avoir les fenêtres en haut et en bas). si vous avez un fichier spécifique à ouvrir dans la deuxième fenêtre, vous pouvez inclure le chemin comme ceci::vnew /path/to/secondfile.txt
  • utilisez F8 pour activer une fonction personnalisée qui active et désactive le mode Diff

voici la fonction personnalisée qui est dans mon ~/.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

vous pouvez utiliser la commande :diffthiset diffoff!que vous ne devez pas définir toutes les options diff vous (par exemple cursorbind est également fixé par diffmode)
Christian Brabandt
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.