*diff.txt* Pour Vim version 6.2. MANUEL de RÉFÉRENCE VIM - par Bram Moolenaar *diff* *vimdiff* *gvimdiff* *diff-mode* Ce fichier décrit la fonctionnalité |+diff|, qui permet de mettre en évidence les différences entre deux ou trois versions d'un même fichier. Les bases sont abordées dans la section |08.7| du Manuel de l'utilisateur. 1. Lancer le mode diff |vimdiff| 2. Visualiser les différences |view-diffs| 3. Sauter aux différences |jumpto-diffs| 4. Copier des différences |copy-diffs| 5. Options du mode diff |diff-options| {absent de Vi} ============================================================================== 1. Lancer le mode diff La façon la plus simple de lancer le mode diff est d'invoquer la commande `vimdiff`. Elle lance Vim comme d'habitude, en le paramétrant pour visualiser les différences entre les arguments. > vimdiff fichier1 fichier2 [fichier3 [fichier4]] Ceci équivaut à : > vim -d fichier1 fichier2 [fichier3 [fichier4]] Vous pouvez également utiliser `gvimdiff` ou `vim -g` : l'IHM graphique est alors activée. Ou encore `viewdiff` ou `gviewdiff` : Vim est lancé en mode lecture seule. Un 'r' peut être préfixé pour le mode restreint (voir |-Z|). Le deuxième argument et ceux qui suivent peuvent être un nom de répertoire. Vim ajoutera alors le nom de fichier du premier argument au nom du répertoire pour trouver le fichier. Cela fonctionne uniquement quand une commande standard `diff` est disponible. Voir 'diffexpr'. En mode diff, Vim ouvre une fenêtre pour chacun des fichiers, comme si l'argument de commande |-O| était utilisé. Cela crée un partage vertical. Si vous préférez un partage horizontal, ajoutez l'argument |-o| : > vimdiff -o fichier1 fichier2 [fichier3] Dans chaque fichier édité, ces options sont fixées : 'diff' activé 'scrollbind' activé 'scrollopt' inclut "hor" 'wrap' désactivé 'foldmethod' "diff" 'foldcolumn' 2 Ces options sont locales aux fenêtres. Ainsi, si vous ouvrez une nouvelle fenêtre ou que vous éditez un autre fichier, elles sont remises à leurs valeurs globales. Les différences affichées sont en fait les différences dans le tampon. Ainsi, si vous faites des changements après le chargement d'un fichier, ils seront pris en compte lors de l'affichage des différences. Vous devrez cependant mettre à jour ces différences avec ":diffupdate", tous les changements ne sont pas immédiatement pris en compte. Vous pouvez spécifier des paramétrages spéciaux pour le mode diff dans votre fichier vimrc. Utilisez une construction comme celle-ci : > if &diff paramètres en mode diff else paramètres en mode non-diff endif Si vous êtes déjà dans Vim, vous pouvez lancer le mode diff de trois façons : *E98* *:diffs* *:diffsplit* :diffs[plit] {nomfich} Ouvre une nouvelle fenêtre pour le fichier {nomfich}. Les options sont fixées comme avec `vimdiff` pour les fenêtres courante et nouvellement ouverte. Voir aussi 'diffexpr'. *:difft* *:diffthis* :difft[his] Associe la fenêtre courante aux fenêtres diff. Les options sont fixées comme avec `vimdiff`. *:diffp* *:diffpatch* :diffp[atch] {fichrustine} Utilise le tampon courant, lui applique les différences trouvées dans {fichrustine} et ouvre un tampon contenant le résultat. Les options sont fixées comme avec `vimdiff`. {fichrustine} peut être dans n'importe quel format reconnu par le programme `patch` ou supporté par 'patchexpr'. NOTE : {fichrustine} ne doit contenir les différences que pour un seul fichier, le fichier courant. Si {fichrustine} contient les différences pour d'autres fichiers, les conséquences sont imprévisibles. Vim changera de répertoire pour "/tmp" afin d'éviter que les fichiers dans le répertoire courant ne soient accidentellement modifiés. Mais divers fichiers ".rej" pourraient cependant être créés. Et lorsque des noms de chemins absolus sont utilisés, ces fichiers risquent d'être modifiés de toute façon. Pour que ces commandes utilisent un partage vertical, préfixez |:vertical|. Exemples : > :vert diffsplit main.c~ :vert diffpatch /tmp/diff < *E96* Il peut y avoir jusqu'à quatre tampons avec l'option 'diff' activée. Comme les valeurs des options sont mémorisées avec le tampon, vous pouvez éditer un autre fichier pendant un moment, revenir au fichier précédent et vous retrouver à nouveau en mode diff. Si vous ne voulez plus le mode diff, désactivez l'option 'diff'. Débarrassez-vous de même de la colonne de repli : > :set nodiff :set foldcolumn=0 ============================================================================== 2. Visualiser les différences *view-diffs* En mode diff, les fenêtres diff affichent le même texte, mais avec les différences en surbrillance. Quand vous faites défiler du texte dans une fenêtre, l'option 'scrollbind' fera également défiler le texte dans les autres fenêtres. Avec le partage vertical, le texte devrait être aligné correctement. L'alignement du texte sera faussé si : - 'wrap' est activé, certaines lignes sont enroulées et occupent deux lignes d'écran ou plus ; - des replis sont ouverts dans une fenêtre mais pas dans une autre ; - 'scrollbind' est désactivé ; - des changements ont été apportés au texte ; - "filler" n'est pas inclus dans 'diffopt', et des lignes insérées/supprimées décalent l'alignement. Tous les tampons édités dans une fenêtre où l'option 'diff' est activée seront associés au mode diff. Cela vaut aussi pour les tampons cachés. Ils devront d'abord avoir été édités dans une fenêtre pour que ce soit possible. L'option 'diff' étant locale à une fenêtre, il est possible de visualiser le même tampon en mode diff dans une fenêtre et « normal » dans une autre. Il est également possible de visualiser les changements que vous avez effectués sur un tampon, mais comme Vim interdit d'avoir deux tampons pour le même fichier, vous devrez préalablement faire une copie du fichier original et comparer avec elle. Par exemple : > :!cp % fichtemp :diffsplit fichtemp Un tampon déchargé ne peut pas être utilisé pour le mode diff. Mais cela fonctionne avec les tampons cachés. Vous pouvez utiliser ":hide" pour fermer une fenêtre sans décharger le tampon. *:diffu* *:diffupdate* Vim essaie de garder les différences à jour quand vous apportez des modifications au texte. Ce sont essentiellement les lignes insérées ou supprimées qui sont prises en compte. Mais les changements à l'intérieur d'une ligne ou d'autres modifications plus complexes n'entraîneront pas de mise à jour des différences. Pour forcer cette mise à jour, utilisez : > :diffupdate Vim affichera des lignes de remplissage pour les lignes absentes d'une fenêtre mais présentes dans une autre. Ces lignes ont été insérées dans un autre fichier ou supprimées dans celui-ci. Si vous enlevez "filler" de l'option 'diffopt', Vim n'utilisera pas de lignes de remplissage. Des replis sont utilisés pour masquer le texte qui n'est pas modifié. Voir |folding| pour toutes les commandes qui peuvent être utilisées avec les replis. Le nombre de lignes de contexte encadrant une différence qui n'est pas inclus dans un repli peut être fixé avec l'option 'diffopt'. Par exemple, pour utiliser trois lignes de contexte : > :set diffopt=filler,context:3 Les différences sont mises en surbrillance selon ces groupes : |hl-DiffAdd| DiffAdd Lignes ajoutées (insérées). Ces lignes sont présentes dans ce tampon, mais pas dans l'autre. |hl-DiffChange| DiffChange Lignes modifiées. |hl-DiffText| DiffText Texte modifié à l'intérieur d'une Ligne modifiée. Vim recherche les premier et dernier caractères qui sont différents (en commençant depuis la fin de la ligne). Le texte entre ces deux positions est mis en surbrillance. Cela implique que des parties non modifiées entre ces positions seront mises en surbrillance malgré tout. |hl-DiffDelete| DiffDelete Lignes supprimées. Également nommées lignes de remplissage, car elles n'existent pas vraiment dans ce tampon. ============================================================================== 3. Sauter aux différences *jumpto-diffs* Deux commandes peuvent être utilisées pour sauter aux différences : *[c* [c Saute vers l'arrière au début de la différence précédente. Si un quantificateur est donné, le fait autant de fois. *]c* ]c Saute vers l'avant au début de la différence suivante. Si un quantificateur est donné, le fait autant de fois. Une erreur est émise quand il n'y a pas de changement vers lequel sauter. ============================================================================== 4. Copier des différences *copy-diffs* *E99* *E100* *E101* *E102* *E103* Il existe deux commandes pour copier du texte d'un tampon dans un autre. Les tampons ainsi obtenus seront identiques sur la plage de texte spécifiée. *:diffg* *:diffget* :[plage]diffg[et] [tampspec] Modifie le tampon courant pour annuler une différence avec un autre tampon. Si [tampspec] est donné, ce tampon est utilisé. Sinon, cette commande ne fonctionne que s'il y a un autre tampon en mode diff. Voir ci-dessous pour [plage]. *:diffpu* *:diffput* :[plage]diffpu[t] [tampspec] Modifie l'autre tampon pour annuler une différence avec le tampon courant. Comme ":diffget", mais c'est l'autre tampon qui est modifié au lieu du courant. Voir ci-dessous pour [plage]. *do* do Comme ":diffget" sans argument ni plage. "do" est choisi en remplacement de "dg", qui ne peut pas être utilisé ici ! ["Obtain"] *dp* dp Comme ":diffput" sans plage ni argument. Quand aucune [plage] n'est donnée, la différence à la position du curseur ou juste au-dessus est affectée. Lorsqu'une plage est utilisée, Vim essaie de n'opérer que sur les lignes spécifiées. Quand il y a des lignes supprimées, cela n'est pas toujours possible. L'argument [tampspec] ci-dessus peut être un numéro de tampon, un motif pour un nom de tampon ou une partie d'un nom de tampon. Exemples : :diffget utilise l'autre tampon en mode diff :diffget 3 utilise le tampon 3 :diffget v2 utilise le tampon qui correspond à "v2" et est en mode diff (p. ex., "fichier.c.v2") NOTE : Les lignes supprimées sont affichées, mais ne comptent pas comme des lignes de texte. Vous ne pouvez pas y déplacer le curseur. Pour remplir les lignes supprimées avec les lignes d'un autre tampon, utilisez ":diffget" sur la ligne au-dessous d'elles. Il peut y avoir des lignes supprimées sous la dernière ligne du tampon. Pour pouvoir importer ces lignes depuis un autre tampon, il est permis d'utiliser le dernier numéro de ligne plus un. Cette commande importe toutes les différences depuis l'autre tampon : > :1,$+1diffget ============================================================================== 5. Options du mode diff *diff-options* Voir aussi |'diffopt'| et l'item "diff" de |'fillchars'|. TROUVER LES DIFFÉRENCES *diff-diffexpr* L'option 'diffexpr' peut être fixée pour utiliser un programme autre que le programme standard `diff` pour comparer deux fichiers et en trouver les différences. Lorsque 'diffexpr' est vide, Vim utilise cette commande pour trouver les différences entre "fichier1" et "fichier2" : > diff fichier1 fichier2 > fichsortie Le '>' est remplacé par la valeur de 'shellredir'. La sortie de `diff` doit être une différence de style Ed normal. N'utilisez pas de différence contextuelle. Voici un exemple du format attendu par Vim : 1a2 ~ > bbb ~ 4d4 ~ < 111 ~ 7c7 ~ < GGG ~ --- ~ > ggg ~ L'élément "1a2" ajoute la ligne "bbb". L'élément "4d4" supprime la ligne "111". L'élément '7c7" remplace la ligne "GGG" par "ggg". Lorsque 'diffexpr' n'est pas vide, Vim l'utilise pour obtenir un fichier diff dans le format susmentionné. Ces variables définissent les noms de fichiers à utiliser : v:fname_in fichier original v:fname_new nouvelle version du même fichier v:fname_out fichier diff produit De surcroît, 'diffexpr' prendra en compte l'inclusion de "icase" et "iwhite" dans l'option 'diffopt'. 'diffexpr' ne peut pas changer la valeur de 'lines' ni de 'columns'. Exemple (produit le même effet que lorsque 'diffexpr' est vide, mais en ajoutant le drapeau "-a" pour forcer la comparaison en tant que texte) : > set diffexpr=MonDiff() function MonDiff() let opt = "" if &diffopt =~ "icase" let opt = opt . "-i " endif if &diffopt =~ "iwhite" let opt = opt . "-b " endif silent execute "!diff -a " . opt . v:fname_in . " " . v:fname_new . \ " > " . v:fname_out endfunction < *E97* Vim fait un test pour voir si la sortie de `diff` semble correcte. Si ce n'est pas le cas, vous obtiendrez un message d'erreur. Causes possibles : - le programme `diff` n'a pas pu être exécuté ; - le programme `diff` ne produit pas des différences de style Ed normal (voir ci-dessus) ; - les options 'shell' et associées ne sont pas fixées correctement ; vérifiez si une commande de filtre fonctionne avec quelque chose comme ":!sort" ; - vous utilisez 'diffexpr' et cela ne marche pas. UTILISER DES RUSTINES *diff-patchexpr* L'option 'patchexpr' peut être fixée pour utiliser autre chose que le programme standard `patch`. Lorsque 'patchexpr' est vide, Vim appelle le programme `patch` comme suit : > patch -o fichsortie fichorig < fichrustine Cela devrait bien fonctionner avec la plupart des versions du programme `patch`. NOTE : Un retour chariot au milieu d'une ligne pourrait poser des problèmes, il est interprété comme une coupure de ligne. Si la valeur par défaut ne marche pas pour vous, fixez 'patchexpr' à une expression qui aura le même effet. Ces variables définissent les noms de fichiers à utiliser : v:fname_in fichier original v:fname_diff fichier rustine v:fname_out fichier produit (auquel on a appliqué la rustine) Exemple (produit le même effet que lorsque 'patchexpr' est vide) : > let patchexpr=MonPatch function MonPatch :call system("patch -o " . v:fname_out . " " . v:fname_in . \ " < " . v:fname_diff) endfunction Assurez-vous que l'utilisation du programme `patch` n'a pas des effets de bord indésirables. Par exemple, contrôlez qu'il n'y ait pas de fichiers supplémentaires produits, que vous devriez alors supprimer. Le programme doit se contenter d'appliquer la rustine, et rien d'autre. Vim changera le répertoire pour "/tmp" ou un autre répertoire temporaire avant l'évaluation de 'patchexpr'. Cela permet théoriquement d'éviter que les fichiers du répertoire courant ne soient modifiés accidentellement. Vim supprimera aussi les fichiers débutant par v:fname_in et se terminant par ".rej" et ".orig". vim:tw=78:ts=8:ft=help:norl: