2011-06-16 14 views

Respuesta

6

Si usted acaba de eliminar algo de texto usando d, puede utilizar /<CTRL-R>" para que coincida con el texto que acaba de borrar (incluso si usted acaba de deshacer el borrado con u).

Esto no funcionará si el texto eliminado contiene líneas nuevas o metacaracteres de expresiones regulares (como \ o [). Si eso es probable, intente:

/\V<CTRL-R>=substitute(substitute(getreg('"'), "[\\/]", '\\\0', 'g'), "\n", '\\n', "g") 
  • \V - muy nomagic - desactiva la mayoría de expresiones regulares meta-caracteres
  • <CTRL-R>= - Introducir la evaluación de una expresión vim
  • substitute(..., "\n", '\\n', "g") - escapar de todas las nuevas líneas en el dada cadena
  • substitute(..., "[\\/]", '\\\0', 'g') - escapar de todas las barras y las barras invertidas en la cadena dada
  • getreg('"') - t conseguir él contenido del registro ", que contiene el texto más recientemente dio un tirón y/o eliminado

Esto es un poco prolijo, así que si ves que necesitas hacerlo a menudo, puede enlazar a un comando en su ~/.vimrc:

" use ,/ in normal mode to match the most recently deleted or yanked text 
nmap ,/ /\V<C-R>=substitute(substitute(getreg('"'), "[\\/]", '\\\0', 'g'), "\n", '\\n', "g")<CR><CR><CR> 
+0

+1 Muy bueno. No sabía sobre esto. –

+0

@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

+0

@Remonn: Whoops, typo. ¿Inténtalo de nuevo? – rampion

4

¿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 
+0

Mantendré su solución también. Bueno saber. Gracias Peter. – Reman

+0

Peter, recibo muchas veces este error: E499: Nombre de archivo vacío para '%' o '#', solo funciona con ": p: h": r # -> Revisé un poco en la red pero no puedo Descubra cómo resolver este error – Reman

+0

@Remonn: también recibo ese error cuando el archivo no tiene un nombre de archivo, es decir, no se ha guardado. Actualizaré mi respuesta con una versión que no tenga ese problema. –

2

Prueba el histwin o plug-in Gundo. Le permite diferenciar todas las ramas de deshacer y muestra también un diff unificado para las diferencias en la ventana de vista previa.

+0

Gundo necesita soporte python 2.4 y gvim 7.3 no tiene soporte Python 2.4+.Ya uso el plugin histwin (buen plugin, eres el autor, ¿no?). No puedo encontrar la manera de resaltar las diferencias en el texto. Encuentro que la solución de Peter es muy fácil de aplicar y me gusta que no use el comando diffthis. – Reman

+0

Sí, soy el autor. El complemento de histwin no puede mostrar realmente las diferencias, pero presionar 'U' en una entrada debería mostrar un diff unificado en la ventana de vista previa, mientras que presionar 'D' debería darle una sugerencia similar a Peters para mostrarle una diferencia de ambos estados de búfer. –

+0

lo siento, me refiero a "la solución de rampion" es fácil de aplicar y no utiliza el comando diffthis. Gracias por su información adicional sobre el complemento. – Reman

Cuestiones relacionadas