Destacado deshacer en Vim

12

Estoy tratando de tener un deshacer resaltado en Vim, como la configuración predeterminada de spacemacs. A veces, cuando quiero deshacer rápidamente, no puedo darme cuenta de lo que cambió porque es instantáneo. Así que estoy tratando de tener algo como esto cuando una prensa deshace:

destacó deshacer

¿Alguien tiene una idea de cómo hacer esto en Vim?

(Ya tengo el complemento Gundo, solo quiero hacer que el deshacer predeterminado sea más fluido)

Editar : el plugin de Unotree hace el trabajo ( Gundo no resalta los cambios), solo use el UndotreeTogglecomando y todos los cambios futuros en el archivo se resaltarán.

tjbrn
fuente
Buena idea. Puede crear un resaltado con matchadd(), pero un poco más complicado es determinar qué partes del archivo han cambiado.
joeytwiddle
Tal vez guardar en un búfer / archivo temporal antes de deshacer, luego en un segundo búfer / archivo después de deshacer y resaltar los nuevos diferenciales después de limpiar (o cambiar el color de) los anteriores. Podría ser lento para archivos grandes.
VanLaser
UndoTree realmente resalta las líneas cambiadas , pero no lo hace en tiempo real. Creo que usa GNU diff. Obtener granularidad de palabras sería un paso adicional (por ejemplo, líneas divididas en saltos de palabras , diferencias, líneas recombinantes).
joeytwiddle
Estos complementos se acercan, pero todavía están basados ​​en líneas : el desprestigio puede resaltar las líneas cambiadas desde el último guardado. changesPlugin marca las líneas cambiadas (incluidas las eliminaciones) en el canal de la izquierda.
joeytwiddle
1
@joeytwiddle, changesPlugin también puede resaltar la última región de cambio
Christian Brabandt

Respuestas:

6

Nueva solución

Puede ver sus últimos cambios con el :changescomando. Por lo tanto, puede realizar su cambio de línea más reciente con una expresión regular y luego aplicar la línea matchadd()según lo sugerido por @joeytwiddle.

Aquí está el código:

function! DiffWithPrevious()
  call clearmatches()
  redir => message
  silent changes
  redir END
  let line = matchstr(message, '\v\n\s{4}1[^0-9]*\zs\d+\ze')
  highlight TemporalDiff ctermbg=green guibg=green
  let m = matchadd('TemporalDiff', '\%'.line.'l')
endfunction

Nota :

  • Esta función solo agrega un nuevo resaltado sin eliminar el anterior, por lo que primero deberá eliminar el anterior. Con la clearmatchesfunción puede eliminar las coincidencias antes de agregar una nueva. Cuidado, eliminará TODAS las coincidencias. Si desea más granularidad, puede guardar su coincidencia y eliminarla manualmente:

p.ej

function! DiffWithPrevious()
  call matchdelete(m)
  ... 
  let m = matchadd('TemporalDiff', '\%'.line.'l')
endfunction
  • Después de algunas pruebas, descubrí que solo funciona para el cambio de una línea.

Referencias


Vieja solución

Aquí hay una posible solución, inspirada principalmente en el búfer actual Diff y el archivo original :

function! DiffWithPrevious()
  undo
  write
  redo
  let filetype=&ft
  diffthis
  vnew | r # | normal! 1Gdd
  diffthis
  exe "setlocal bt=nofile bh=wipe nobl noswf ro ft=" . filetype
endfunction

La idea es diferenciar el archivo con el archivo en el sistema, para que pueda deshacer su último cambio, escribirlo, rehacer el último cambio y ejecutar el diferencial.

Creo que esto debería hacer el trabajo para las visualizaciones temporales temporales.

nobe4
fuente
Hay una manera de borrar el mensaje "buffer" en DiffWithPrevious ()? Deseo que la función resalte solo los últimos cambios, pero el resaltado se acumula con el tiempo, estoy intentando algo como mensaje = 0 o mensaje = "" pero sin éxito.
tjbrn
Por supuesto que sí, déjame actualizar mi respuesta.
nobe4
2

Para alguien que está intentando lo mismo de mí, eso es lo más cercano que alcancé gracias a las respuestas.

function! DiffWithPrevious()
  call clearmatches()
  undo
  redir => message
  silent changes
  redir END
  let line = matchstr(message, '\v\n\s{4}1[^0-9]*\zs\d+\ze')
  highlight TemporalDiff ctermbg=black guibg=black
  let m = matchadd('TemporalDiff', '\%'.line.'l')
  redraw
  let gchar = getchar()
  highlight TemporalDiff ctermbg=none guibg=none
  let m = matchadd('TemporalDiff', '\%'.line.'l')
endfunction
tjbrn
fuente