Edição em modo diff ao vivo no vim

Edição em modo diff ao vivo no vim

Quero uma visualização ao vivo das diferenças enquanto edito um arquivo. vimdiffé capaz de fazer algo que desejo, como destacar as diferenças entre dois arquivos.

No entanto, há duas desvantagens que vimdiffme impedem.

Primeiro, ele não pode armazenar em buffer o mesmo arquivo de forma independente para permitir uma diffcomparação. Esse problema pode ser facilmente contornado. Eu tenho o seguinte script de shell (chame-o de diffvim) para armazenar vimdiffem buffer o mesmo arquivo de forma independente (fazendo uma cópia temporária do arquivo em edição).

#!/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

A segunda desvantagem é vimdiffque a edição donão-diferentepartes de uma das duas cópias do mesmo arquivo não aciona diffo recálculo das diferenças. É preciso fazer isso manualmente invocando :diffupdate. Quero que esse recálculo seja automatizado. A maneira relativamente conveniente que sinto é ativá-lo quando saio doINSERIRmodo e entre noNORMALmodo. Novamente, isso pode ser feito facilmente adicionando o seguinte mapeamento ao meu .vimrcarquivo:

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

No entanto, ainda não é a solução perfeita. Porque se eu fizer alguma edição noNORMALmodo, isto é, sem entrar e sair doINSERIRmodo, o recálculo ainda não será acionado automaticamente após a edição ser concluída. Então adiciono outro mapeamento ao meu .vimrcarquivo:

nnoremap <Esc> :diffu<CR>

Mas desta vez algo estranho acontece. Quando abro um arquivo para edição, algumas das combinações de teclas padrão funcionam mal. Por exemplo, se eu pressionar a tecla hou l(ou seja, qualquer um deles sendo o primeiro comando que emito após abrir o arquivo), todos me levam aINSERIRmodo, enquanto tecla jou Gexclui uma linha ou todo o conteúdo, etc. Mas se depois de abrir o arquivo, eu pressionar a tecla Escprimeiro, esses comandos funcionarão bem.

Alguma ideia do que está errado? Você tem uma solução alternativa?

Responder1

Depois de pesquisar autocmdno vimdoc, acho que encontrei a solução que faz exatamente o que desejo:

autocmd CursorMoved,CursorMovedI * diffupdate

Muito obrigado ao Ingo pela sua sugestão!

Responder2

<Esc>também é usado em vários códigos de teclas especiais e desempenha um papel na impressão no terminal.

É uma má ideia sobrecarregá-lo, especialmente com algo tão invasivo como você fez. Use uma chave diferente, por exemplo <Leader><Leader>, ou defina um gatilho em eventos:

:autocmd InsertEnter,InsertLeave * diffupdate

informação relacionada