Edição no modo diff ao vivo no vim

2

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?

    
por day 12.04.2013 / 17:16

2 respostas

3

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!

    
por 12.04.2013 / 23:32
2

<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
    
por 12.04.2013 / 17:39

Tags