
Quiero una vista en vivo de las diferencias mientras edito un archivo. vimdiff
Es capaz de hacer algo que quiero, como resaltar las diferencias entre dos archivos.
Sin embargo, hay dos inconvenientes vimdiff
que me frenan.
En primer lugar, no puede almacenar en buffer el mismo archivo de forma independiente para permitir una diff
comparación. Este problema se puede solucionar fácilmente. Tengo el siguiente script de shell (llámelo diffvim
) para hacer que vimdiff
el mismo archivo en el buffer sea independiente (haciendo una copia temporal del archivo que se está editando).
#!/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 vimdiff
es que editar elno diferenciadopartes de una de las dos copias del mismo archivo no activan diff
el recálculo de las diferencias. Hay que hacerlo manualmente invocando :diffupdate
. Quiero que este recálculo se automatice. La forma relativamente conveniente que siento es activarlo cuando salgo delINSERTARmodo y entrar en elNORMALmodo. Nuevamente, esto se puede hacer fácilmente agregando la siguiente asignación a mi .vimrc
archivo:
inoremap <Esc> <Esc>:diffu<CR>
Sin embargo, todavía no es la solución perfecta. Porque si hago algunas ediciones en elNORMALmodo, es decir, sin entrar y luego salir delINSERTARmodo, el recálculo aún no se activará automáticamente después de realizar la edición. Entonces agrego otra asignación a mi .vimrc
archivo:
nnoremap <Esc> :diffu<CR>
Pero esta vez sucede algo extraño. Cuando abro un archivo para editarlo, algunas de las combinaciones de teclas estándar no funcionan correctamente. Por ejemplo, si presiono la tecla h
o l
(es decir, cualquiera de ellas es el primer comando que emito después de abrir el archivo), todas me llevan aINSERTARmodo, mientras teclea jo Gelimina una línea o todo el contenido, etc. Pero si después de abrir el archivo, presiono la tecla Escprimero, esos comandos funcionan bien.
¿Alguna idea de qué sale mal? ¿Tiene alguna solución alternativa?
Respuesta1
Después de investigar autocmd
en vimdoc, creo que encontré la solución que hace exactamente lo que quiero:
autocmd CursorMoved,CursorMovedI * diffupdate
¡Muchas gracias a Ingo por su sugerencia!
Respuesta2
<Esc>
También se utiliza en varios códigos clave de claves especiales y desempeña un papel en la impresión en el terminal.
Es mala idea sobrecargarlo, especialmente con algo tan invasivo como lo hiciste tú. Utilice una clave diferente, por ejemplo <Leader><Leader>
, o defina un activador de eventos:
:autocmd InsertEnter,InsertLeave * diffupdate