2010-09-01 10 views
35

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

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!

Respuesta

22

No puede hacer esto dentro del archivo original, pero puede hacerlo sin usar archivos separados, solo búferes separados. Esto debería funcionar si ha copiado una subrutina en el registro a (por ejemplo, con "ay escrito 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> 

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

+1

Esto funciona muy bien pero sigo recibiendo "No se borraron los búferes: bwitpeout! 2" (el número cambia) cuando llamo a WipeOutDiffs a través de f8. ¿Qué está causando esto? ¡¡Gracias!! –

1

puede probar Block diff vim plugin, hará 2 nuevos búfers en una nueva pestaña para mostrar las diferencias.

+0

Vi su código: hace casi exactamente lo que hace mi solución anterior, pero no puede cerrar los búferes abiertos presionando una tecla. – ZyX

+0

Muy bueno, pero solo funciona cuando tienes una GUI, que no siempre es mi caso cuando trabajo en un servidor remoto. Entonces, elegí aceptar la respuesta de ZyX. ¡Gracias de cualquier manera! – Nigu

+0

Realmente funciona en la versión de vim no-GUI (usando vim 7.3). Utiliza la implementación de pestañas que no pertenecen a la GUI, tal vez no estaba presente cuando se escribió el complemento, por lo que ahora solo funciona. – lessthanideal

3

me gusta mucho la respuesta de ZYX, pero es necesario hacer dos modificaciones para que funcione a la perfección:

  1. tal como se aplica, <F7> reemplaza el búfer activo con la pantalla dividida verticalmente diff. Luego, mientras <F8> cierra el diff, no recarga el buffer original. Para solucionar esto, cambié enew en la tercera línea al 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

40

Plugin linediff.vim : Perform an interactive diff on two blocks of text es similar a la puntiaguda ou de Vincent con algunas características adicionales:

  • tiene un comando para cerrar el buffer abierto
  • parece para trabajar sin GUI
  • inserte alguna indicación visual en los archivos originales que se están difiriendo.

Para usarlo se realiza una selección visual en el primer bloque para diferenciar, introduzca el comando :Linediff, y repetirlo al segundo bloque. Para dejar de fumar, :LineDiffReset

he encontrado los siguientes mapas útiles:

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

Este plugin funciona muy bien. Está documentado y mantenido en git. Resalta los bloques seleccionados en los archivos originales. No requiere gvim. No veo cómo se podría mejorar y, en mi opinión, es la mejor solución. Por favor pruébalo y vota arriba. –

4

Puede escribir esas dos partes/subrutinas/secciones de 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 comienzo de la sección, pulse v y seleccionar hasta el final de la sección y luego presione:. se 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.

2

He estado usando este comando:

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

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

+0

leyendo esto después de un tiempo, todavía me pregunto por qué utilicé 'cat' ... dejarlo también debería funcionar:' vimdiff <(sed -n 10,15p file.foo) <(sed -n 20,25p file.foo) ' – kuzyn

Cuestiones relacionadas