tool vim diff vimdiff

vim diff tool



(Vim) diff dos subrutinas en el mismo archivo (6)

¿Es posible modificar o incluso modificar vimdiff dos subrutinas casi similares que se producen en el mismo archivo? ¿Si es así, cómo?

Puedo pensar en copiar las dos subrutinas en dos archivos separados y luego diferirlos, pero ¿hay alguna manera de hacerlo dentro del archivo original?

¡Gracias!


He estado usando este comando:

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

Donde los números alimentados a sed son el número de línea que quiero diferenciar en el archivo. <(*) significa evaluar y redirigir como entrada.


Plugin linediff.vim: realizar una diferencia interactiva en dos bloques de texto es similar a la señalada por Vincent con algunas características adicionales:

  • tiene un comando para cerrar el búfer abierto
  • parece funcionar sin GUI
  • inserte alguna indicación visual en el (los) archivo (s) original (es) que están siendo diferidos.

Para usarlo, realice una selección visual en el primer bloque para diferenciar, ingrese el comando :Linediff , y :Linediff en el segundo bloque. Para salir :LineDiffReset

Me han resultado útiles los siguientes mapas:

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


Puede escribir esas dos partes / subrutinas / secciones en dos archivos y luego usar vimdiff para ver la diferencia.

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

Si no se siente cómodo con el uso de números de línea, puede mantener el cursor al inicio de la sección, presionar v y seleccionar hasta el final de la sección y luego presionar:. mostrará: ''<,''>. Luego escriba escribir y luego el nombre del archivo en la línea de comando. Presione enter. Similary, haz por el segundo también. Luego puede ejecutar el comando vimdiff como se indicó anteriormente.

(El comando de escritura guarda la pieza en un nuevo archivo.) Escribir un nuevo archivo puede no ser una buena idea, pero eso me ayuda. Especialmente cuando tuvimos que pasar por la comparación varias veces.

Esta es una de las formas más simples sin usar el complemento o si no le preocupa la memoria.


Realmente me gusta la respuesta de ZyX, pero necesitaba hacer dos modificaciones para que funcione sin problemas:

  1. Como se implementó, <F7> reemplaza el búfer activo con la pantalla de diferencias dividida verticalmente. Luego, mientras <F8> cierra el diff, no recarga el buffer original. Para solucionar esto, cambié enew en la tercera línea para execute ''tab split | enew'' execute ''tab split | enew'' .

  2. Para minimizar los efectos secundarios, agregué call remove(a:diffed_buffers, 0, -1) justo antes del final de WipeOutDiffs ().

HTH, - Stu



No puede hacer esto dentro del archivo original, pero puede hacerlo sin usar archivos separados, solo búferes separados. Esto debería funcionar si copió una subrutina en el registro a (por ejemplo, con "ay mecanografiado en modo visual") y otra subrutina en el registro b :

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

Para automatizar:

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>

Tenga en cuenta que es posible que desee establecer la opción hidden si Vim se niega a abandonar el archivo modificado (consulte :h abandon ).