vim: diff deux sections dans deux fichiers, mais pas le fichier entier?

14

J'ai mis à niveau un système de Nagios 2 à Nagios 3, et maintenant je compare certaines différences dans les anciens et les nouveaux fichiers de configuration.

Il y a des changements importants dans les fichiers de configuration, et je ne veux pas effectuer de différence sur tout le fichier parce que vimdiff me montre trop de différences non pertinentes et a du mal à traiter les #commentaires au début des lignes, etc.

Puis-je utiliser vim ou une fonctionnalité de type vimdiff pour effectuer un diff sur deux sections particulières dans deux fichiers différents?

Par exemple, je veux différencier uniquement les lignes qui ressemblent à ceci:

# Define a service to check the load on the local machine. 

define service{
    use                             local-service         ; Name of service template to use
    host_name                       localhost
    service_description             Blah Blah
    check_command                   Blah Blah
    }
Stefan Lasiewski
la source

Réponses:

18

Cela ressemble à linediff.vim pourrait être ce que vous voulez: "Effectuer un diff interactif sur deux blocs de texte".

Vous spécifiez chaque bloc (plage de lignes) avec sa :Linediffcommande (par exemple :4,10Linediff, ou effectuez d'abord une sélection visuelle, puis tapez :Linediff(qui apparaît comme :'<,'>LineDiff)). Les plages peuvent provenir du même fichier / tampon ou de fichiers différents. Une fois que vous avez spécifié deux plages, il ouvre un nouvel onglet qui a deux nouveaux tampons en mode diff (dans une division) pour les plages spécifiées. Vous pouvez modifier et :wdans l'un de ces tampons pour mettre à jour les plages d'origine. Lorsque vous avez terminé, :qsortez des tampons diff et :LinediffResetsupprimez les spécificateurs de plage dans les tampons d'origine.

La réponse Stackoverflow où j'ai entendu parler de linediff.vim pour la première fois suggère également quelques mappages. D'autres réponses à cette question mentionnent également une solution personnalisée et un autre plugin qui peut résoudre ce même problème.

Chris Johnsen
la source
6

Je n'ai pas trouvé de moyen vraiment simple de le faire, mais j'ai eu un assez bon succès avec le plugin NrrwRgn (Narrow Region), http://www.vim.org/scripts/script.php?script_id=3075 . Il vous permet de sélectionner une région d'un tampon et d'ouvrir cette région dans un nouveau tampon. Vous pouvez modifier ce nouveau tampon et lorsque vous le fermez, le plugin copie automatiquement votre texte modifié dans la région dont il provient dans le fichier d'origine. Vous pouvez également copier différentes régions d'un ou plusieurs fichiers dans de nouveaux tampons, puis différencier ces nouveaux tampons. C'est comme ça que j'utilise habituellement le plugin - pour vérifier les différences entre des fonctions similaires définies dans un fichier.

Dans votre cas, vous pouvez ouvrir les deux fichiers dans Vim, puis utiliser Vpour sélectionner la section d'intérêt dans le premier fichier et taper \nrpour copier cette section dans un nouveau tampon. Répétez l'opération pour la section similaire de l'autre fichier. Ensuite, dans chacun des deux nouveaux tampons, exécutez :diffthis.

garyjohn
la source
Je vous remercie! Que va \nrfaire?
Stefan Lasiewski
1
Le plugin mappe <Leader>nr, où par <Leader>défaut est `\`, à la commande de plugin qui copie la région sélectionnée dans un nouveau tampon.
garyjohn
@garyjohn comment organisez-vous les NrrrRgnscissions?
dev
1
@dev: J'ai les deux lignes de configuration NrrwRgn suivantes dans mon ~ / .vimrc: let g:nrrw_rgn_vert = 1et let g:nrrw_rgn_protect = 'n'. Avec le premier, NrrwRgn se divise ouvert à gauche de la fenêtre actuelle. J'ai oublié s'ils s'ouvrent immédiatement à gauche ou à l'extrême gauche. Cela dit, je n'utilise plus NrrwRgn pour cela, ayant trouvé quelque chose de mieux: Linediff. Il ouvre les nouvelles régions dans un nouvel onglet, que je trouve plus soigné et plus pratique. Vous pouvez trouver LInediff à http://www.vim.org/scripts/script.php?script_id=3745ou https://github.com/AndrewRadev/linediff.vim.
garyjohn
Merci beaucoup @garyjohn. NrrwRgnfait l'extrême gauche ou le haut, ce qui rend les scissions à peu près ingérables. J'ai même essayé les !variantes mais elles se sont révélées très fragiles (erreurs de script + pas de moyen propre de revenir au fichier d'origine). Je vais linediff.vimessayer aussi, même si j'espère que cela NrrwRgns'améliorera à l'avenir.
dev