Desfazer destacado no Vim


12

Eu estou tentando ter um desfazer realçado no Vim, como a configuração padrão do spacemacs. Às vezes, quando quero desfazer rapidamente, não consigo perceber o que mudou porque é instantâneo. Então, eu estou tentando ter algo assim quando uma imprensa desfaz:

destacado desfazer

Alguém tem uma idéia de como fazer isso no Vim?

(Eu já tenho o plugin Gundo, eu só quero tornar o desfazer mais suave)

Editar : O plugin undotree faz o trabalho (o Gundo não destaca as alterações), basta usar o UndotreeTogglecomando e todas as alterações futuras no arquivo serão destacadas.


Boa ideia. Você pode criar um destaque com matchadd(), mas um pouco mais complicado é descobrir quais partes do arquivo foram alteradas.
Joeytwiddle

Talvez você salve em um buffer / arquivo temporário antes de desfazer, depois em um segundo buffer / arquivo após o desfazer e destaque as novas diferenças após limpar (ou alterar a cor) das anteriores. Pode ficar lento para arquivos grandes.
VanLaser

O UndoTree realmente destaca as linhas alteradas , mas não o faz em tempo real. Eu acho que ele usa GNU diff. Obter granularidade de palavras seria uma etapa extra (por exemplo, linhas divididas em quebras de palavras , diferenças, linhas de recombinação).
Joeytwiddle 22/08/2015

Esses plugins chegam perto, mas ainda são baseados em linhas : o smeargle pode destacar as linhas alteradas desde o último salvamento. changesPlugin marca as linhas alteradas (incluindo exclusões) na sarjeta à esquerda.
precisa saber é o seguinte

1
@joeytwiddle, changesPlugin também pode destacar a região da última alteração
Christian Brabandt

Respostas:


6

Nova solução

Você pode ver suas últimas alterações com o :changescomando Para que você possa alterar sua linha mais recente com uma regex e aplicá-la matchadd()conforme sugerido por @joeytwiddle.

Aqui está o código:

function! DiffWithPrevious()
  call clearmatches()
  redir => message
  silent changes
  redir END
  let line = matchstr(message, '\v\n\s{4}1[^0-9]*\zs\d+\ze')
  highlight TemporalDiff ctermbg=green guibg=green
  let m = matchadd('TemporalDiff', '\%'.line.'l')
endfunction

Nota :

  • Essa função adiciona apenas um novo destaque sem remover o antigo, portanto, você deve remover o antigo primeiro. Com a clearmatchesfunção, você pode remover as correspondências antes de adicionar uma nova. Cuidado, ele removerá TODAS as correspondências. Se você quiser mais granularidade, salve sua correspondência e remova-a manualmente:

por exemplo

function! DiffWithPrevious()
  call matchdelete(m)
  ... 
  let m = matchadd('TemporalDiff', '\%'.line.'l')
endfunction
  • Após alguns testes, descobri que só funciona para alterações em uma linha.

Referências :


Solução antiga

Aqui está uma solução possível, inspirada principalmente no buffer de corrente Diff e no arquivo original :

function! DiffWithPrevious()
  undo
  write
  redo
  let filetype=&ft
  diffthis
  vnew | r # | normal! 1Gdd
  diffthis
  exe "setlocal bt=nofile bh=wipe nobl noswf ro ft=" . filetype
endfunction

A idéia é diferenciar o arquivo com o arquivo no sistema, para que você desfaça sua última alteração, escreva-a, refaça a última alteração e execute a diferença.

Eu acho que isso deve funcionar para visualizações de diferenças temporais de tempos em tempos.


existe uma maneira de limpar a mensagem "buffer" em DiffWithPrevious ()? Desejo que a função destaque apenas as últimas alterações, mas o destaque está se acumulando ao longo do tempo, estou tentando algo como message = 0 ou message = "", mas sem sucesso.
precisa saber é

Claro que sim, deixe-me atualizar minha resposta.
precisa saber é


2

Para alguém que está tentando o mesmo de mim, é o mais próximo que cheguei graças às respostas.

function! DiffWithPrevious()
  call clearmatches()
  undo
  redir => message
  silent changes
  redir END
  let line = matchstr(message, '\v\n\s{4}1[^0-9]*\zs\d+\ze')
  highlight TemporalDiff ctermbg=black guibg=black
  let m = matchadd('TemporalDiff', '\%'.line.'l')
  redraw
  let gchar = getchar()
  highlight TemporalDiff ctermbg=none guibg=none
  let m = matchadd('TemporalDiff', '\%'.line.'l')
endfunction
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.