Depois de olhar para autocmd
no vimdoc, acho que encontrei a solução que faz exatamente o que eu quero:
autocmd CursorMoved,CursorMovedI * diffupdate
Muito obrigado a Ingo por sua sugestão!
Eu quero uma visualização ao vivo de diffs enquanto estou editando um arquivo. vimdiff
é capaz de fazer algo que eu quero, como destacar as diferenças entre dois arquivos.
No entanto, existem duas desvantagens de vimdiff
que me impedem.
Primeiro, não é possível armazenar em buffer o mesmo arquivo de forma independente para permitir uma comparação de diff
. Esse problema pode ser facilmente resolvido. Eu tenho o script de shell a seguir (chame de diffvim
) para tornar vimdiff
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 de vimdiff
é que editar as partes não-diff de uma das duas cópias do mesmo arquivo não aciona diff
para recalcular as diferenças. É preciso fazer isso manualmente invocando :diffupdate
. Eu quero que este recálculo seja automatizado. A maneira relativamente conveniente que eu sinto é ativá-lo quando eu sair do modo INSERIR e entrar no modo NORMAL . Isso pode ser feito facilmente adicionando o seguinte mapeamento ao meu arquivo .vimrc
:
inoremap <Esc> <Esc>:diffu<CR>
No entanto, ainda não é a solução perfeita. Porque se eu fizer alguma edição no modo NORMAL , isto é, sem entrar e sair do modo INSERT , o recálculo ainda não será acionado automaticamente após a edição ser feita. Então, adiciono outro mapeamento ao meu arquivo .vimrc
:
nnoremap <Esc> :diffu<CR>
Mas desta vez, algo estranho acontece. Quando eu abro um arquivo para edição, algumas das chaves padrão funcionam mal. Por exemplo, se eu pressionar a tecla h
ou l
(ou seja, qualquer um deles sendo o primeiro comando que eu emiti depois de abrir o arquivo), todos me colocarão no modo INSERIR , enquanto < kbd> j ou G deletar uma linha ou todo o conteúdo, etc. Mas se depois de abrir o arquivo, eu pressionar a tecla Esc primeiro, então esses comandos funcionam bem.
Alguma ideia do que está errado? Você tem uma solução?
<Esc>
também é usado em vários códigos de teclas especiais e desempenha um papel importante na impressão para o terminal.
É uma má idéia sobrecarregá-lo, especialmente com algo tão invasivo como você. Use uma chave diferente, por ex. <Leader><Leader>
ou defina um acionador em eventos:
:autocmd InsertEnter,InsertLeave * diffupdate