42 votes

Comment différencier deux sous-routines dans le même fichier dans Vim ?

Est-il possible de diff ou même vimdiff deux sous-programmes très similaires dans le même fichier ? Si oui, comment ?

Je pense copier les deux sous-routines dans deux fichiers distincts et ensuite diff mais existe-t-il un moyen de le faire à l'intérieur du fichier original ?

51voto

mMontu Points 2843

Plugin linediff.vim : Effectuer un diff interactif sur deux blocs de texte est similaire à celui indiqué par Vincent, avec quelques caractéristiques supplémentaires :

  • dispose d'une commande pour fermer le tampon ouvert
  • semble fonctionner sans interface graphique
  • insérer une indication visuelle sur le(s) fichier(s) original(aux) en cours de différenciation.

Pour l'utiliser, il faut effectuer une sélection visuelle sur le premier bloc à différencier, puis entrer la commande :Linediff et répétez l'opération jusqu'au deuxième bloc. Pour quitter, :LineDiffReset

Les cartes suivantes m'ont été utiles :

noremap \ldt :Linediff<CR>
noremap \ldo :LinediffReset<CR>

9 votes

Ce plugin fonctionne très bien. Il est documenté et maintenu dans git. Il met en évidence les blocs sélectionnés dans les fichiers originaux. Il ne nécessite pas gvim. Je ne vois pas comment il pourrait être amélioré, et à mon avis c'est la meilleure solution. S'il vous plaît, essayez-le et votez pour lui.

24voto

ZyX Points 26516

Vous ne pouvez pas le faire dans le fichier d'origine, mais vous pouvez le faire sans utiliser de fichiers séparés, seulement des tampons séparés. Cela devrait fonctionner si vous copiez une sous-routine dans le registre a (par exemple, avec "ay tapé en mode Visual) et d'autres sous-programmes dans le registre b :

enew | call setline(1, split(@a, "\n")) | diffthis | vnew | call setline(1, split(@b, "\n")) | diffthis

Automatiser :

let g:diffed_buffers = []

function DiffText(a, b, diffed_buffers)
    enew
    setlocal buftype=nowrite
    call add(a:diffed_buffers, bufnr('%'))
    call setline(1, split(a:a, "\n"))
    diffthis
    vnew
    setlocal buftype=nowrite
    call add(a:diffed_buffers, bufnr('%'))
    call setline(1, split(a:b, "\n"))
    diffthis
endfunction

function WipeOutDiffs(diffed_buffers)
    for buffer in a:diffed_buffers
        execute 'bwipeout! ' . buffer
    endfor
endfunction

nnoremap <special> <F7> :call DiffText(@a, @b, g:diffed_buffers)<CR>
nnoremap <special> <F8> :call WipeOutDiffs(g:diffed_buffers) | let g:diffed_buffers=[]<CR>

Notez qu'il est possible que vous souhaitiez définir hidden si Vim refuse d'abandonner le fichier modifié (voir :h abandon ).

1 votes

Cela fonctionne très bien mais je continue à obtenir "No buffers were wiped out : bwitpeout ! 2" (le nombre change) lorsque j'appelle WipeOutDiffs via f8. Quelle en est la cause ? Merci !

6voto

SibiCoder Points 1067

Vous pouvez écrire ces deux parties/sous-programmes/sections dans deux fichiers et utiliser ensuite vimdiff pour voir la différence.

    :1, 39 write part1          //any line range or marks can be used
    :40, 79 write part2
    :!vimdiff part1 part2

Si vous n'êtes pas à l'aise avec les numéros de ligne, vous pouvez garder le curseur au début de la section, appuyer sur v et sélectionner jusqu'à la fin de la section, puis appuyer sur : . il apparaîtra :'<,'>. Tapez ensuite write et le nom du fichier dans la ligne de commande elle-même. Appuyez sur la touche Entrée. Procédez de la même manière pour la deuxième section. Vous pouvez ensuite exécuter la commande vimdiff comme indiqué ci-dessus.

(La commande Write enregistre la partie dans un nouveau fichier). L'écriture d'un nouveau fichier n'est peut-être pas une bonne idée, mais cela m'aide. Surtout lorsque nous avons dû recommencer la comparaison plusieurs fois.

C'est l'une des méthodes les plus simples sans utiliser de plugin ou si vous n'êtes pas préoccupé par la mémoire.

3voto

Stu Points 554

J'aime beaucoup la réponse de ZyX, mais j'ai dû faire deux modifications pour qu'elle fonctionne parfaitement :

  1. Tel qu'implémenté, <F7> remplace la mémoire tampon active par l'affichage de la diff divisée verticalement. Ensuite, lorsque <F8> ferme le diff, il ne recharge pas le tampon d'origine. Pour résoudre ce problème, j'ai modifié enew sur la troisième ligne à execute 'tab split | enew' .

  2. Afin de minimiser les effets secondaires, j'ai ajouté call remove(a:diffed_buffers, 0, -1) juste avant la fin de WipeOutDiffs().

HTH, - Stu

3voto

kuzyn Points 1150

J'ai utilisé cette commande :

vimdiff <(cat file.foo | sed -n 10,15p) <(cat file.foo | sed -n 20,25p)

Où les chiffres ont alimenté sed sont les numéros de ligne que je veux différencier dans le fichier. <(*) signifie évaluer et rediriger comme entrée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X