¿Qué tal llevar el diff del de un estado del archivo y comparar con otro?
:command! -nargs=0 DiffLastChange exe "norm! u" | vert new | set bt=nofile | r # | 0d _ | diffthis | wincmd p | exe "norm! \<c-r>" | diffthis
Ahora sólo puede ejecutar DiffLastChange
para ver un diff del último cambio en el archivo.
Explicación:
exe "norm! u"
deshacer el último cambio en el búfer en
vert new
verticalmente dividir un nuevo buffer
set bt=nofile
el cambio del tipo de tampón a un búfer de cero
r #
leer el contenido de el archivo alternativo es decirel buffer que comenzó con
0d _
limpiar el nuevo buffer mediante la eliminación de la línea en blanco en la parte superior en el registro de agujero negro
diffthis
marcar el búfer de ser parte del diff interruptor
wincmd p
a la búfer pasado (de nuevo a la memoria intermedia empezamos con)
exe "norm! \<c-r>"
ejecutar un hacer de nuevo para restaurar el estado original de amortiguadores
diffthis
marcar el búfer original de ser parte de la diff
Después de que haya terminado, le recomiendo ejecutar :diffoff!
para desactivar ambos diffs.
Lamentablemente, este comando en su estado actual no puede manejar los búferes no guardados que leerá en un archivo. La solución es copiar el contenido del búfer en un registro con nombre y luego pegarlo en el búfer de scratch. Lamentablemente, esto destruirá un registro nombrado. Refactografiar el código en una función dará más flexibilidad y permitirá el uso de una variable para guardar el contenido del registro (y tipo de registro) y restaurar el registro al final.
function! DiffLastChange(...)
let a = @a
let at = getregtype('a')
let c = a:0 == 1 ? a:1 : 1
let ft = &ft
try
exe "norm! " . c . "u"
sil %y a
vert new
set bt=nofile
exe "set ft=" . ft
sil pu a
0d _
diffthis
wincmd p
exe "norm! " . c . "\<c-r>"
diffthis
finally
call setreg('a', a, at)
endtry
endfunction
command! -nargs=? DiffLastChange call DiffLastChange(<f-args>)
Además de solucionar los problemas de amortiguamiento no guardados y clobbering cuestiones, he añadido la capacidad de ir más atrás en la historia a través de un argumento del comando, por ejemplo, :DiffLastChange 3
. El comando también establece el tipo de archivo del búfer de scratch al mismo que los búferes originales para que el resaltado de sintaxis se active para ese búfer.
Para una solución mucho más robusta para ver las diferencias entre las partes de la historia en un búfer, estoy de acuerdo con Christian Brabandt y sugiero Gundo o histwin. Para obtener más información sobre Gundo, consulte este vimcasts.
Para obtener más ayuda, consulte:
:h diffthis
:h diffoff
:h wincmd
:h 'bt'
:h :r
:h :d
+1 Muy bueno. No sabía sobre esto. –
@rampion, tnx, probé el código '\ V ...' A veces funciona y otras no. ¿Hice algo mal? Educación física. Eliminé 3 filas usando este código 'g/\% 3l. \ | \% 5l. \ | \% 6l./D_' pero no se resalta después de un" deshacer " – Reman
@Remonn: Whoops, typo. ¿Inténtalo de nuevo? – rampion