
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 vimdiff
me impedem.
Primeiro, ele não pode armazenar em buffer o mesmo arquivo de forma independente para permitir uma diff
comparação. Esse problema pode ser facilmente contornado. Eu tenho o seguinte script de shell (chame-o de diffvim
) para armazenar vimdiff
em 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 é vimdiff
que a edição donão-diferentepartes de uma das duas cópias do mesmo arquivo não aciona diff
o 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 .vimrc
arquivo:
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 .vimrc
arquivo:
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 h
ou 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 autocmd
no 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