Edición en modo diff en vivo en vim

Quiero una vista en vivo de diffs mientras estoy editando un file. vimdiff puede hacer lo que yo quiera, como resaltar las diferencias entre dos files.

Sin embargo, hay dos inconvenientes de vimdiff que me vimdiff .

En primer lugar, no puede almacenar el mismo file de forma independiente para permitir una comparación de diff . Este problema puede solucionarse fácilmente. Tengo el siguiente script de shell (llámalo diffvim ) para hacer que el buffer de vimdiff el mismo file de forma independiente (haciendo una copy temporal del file bajo edición).

 #!/bin/sh # Differentially Viming TMPDIR=/tmp/diffvim FILENM=$1 FILEBN=$(basename $FILENM) if [ ! -d "$TMPDIR" ]; then mkdir $TMPDIR fi cp $FILENM $TMPDIR/$FILEBN && vimdiff $FILENM $TMPDIR/$FILEBN 

El segundo inconveniente de vimdiff es que la edición de las partes que no son de diff de una de las dos copys del mismo file no desencadena diff para volver a calcular las diferencias. Uno tiene que hacerlo manualmente invocando :diffupdate . Quiero que este recálculo sea automático. La forma relativamente conveniente que siento es activarla cuando salgo del modo INSERT e ingreso al modo NORMAL . De nuevo, esto se puede hacer fácilmente agregando la siguiente asignación a mi file .vimrc :

 inoremap <Esc> <Esc>:diffu<CR> 

Sin embargo, todavía no es la solución perfecta. Porque si realizo alguna edición en el modo NORMAL , es decir, sin ingresar y luego salir del modo INSERTAR , el recálculo no se activará automáticamente una vez que se haya realizado la edición. Así que agrego otra asignación a mi file .vimrc :

 nnoremap <Esc> :diffu<CR> 

Pero esta vez, sucede algo extraño. Cuando abro un file para editarlo, algunas de las correlaciones de teclas estándar no funcionan bien. Por ejemplo, si presiono la tecla h o l (es decir, cualquiera de ellos es el primer command que emito después de abrir el file), todos me ponen en modo INSERT , mientras que la tecla j o G eliminan una línea o todo el contenido, etc. Pero si después de abrir el file, presiono la tecla Esc primero, entonces esos commands funcionan bien.

¿Alguna idea de lo que sale mal? ¿Tiene una solución temporal?

Después de search en autocmd en vimdoc, creo que he encontrado la solución que hace exactamente lo que quiero:

 autocmd CursorMoved,CursorMovedI * diffupdate 

¡Muchas gracias a Ingo por su sugerencia!

<Esc> también se utiliza en varios códigos key de teclas especiales, y desempeña un papel en la printing de la terminal.

Es una mala idea sobrecargarlo, especialmente con algo tan invasivo como tú. Use una tecla diferente, por ejemplo, <Leader><Leader> , o defina un disparador en events:

 :autocmd InsertEnter,InsertLeave * diffupdate