Podświetlone cofnij w Vimie

12

Próbuję mieć podświetlone cofanie w Vimie, jak domyślna konfiguracja spacemacs. Czasami, gdy chcę szybkiego cofnięcia, nie mogę zrozumieć, co się zmieniło, ponieważ jest to natychmiastowe. Więc próbuję mieć coś takiego po cofnięciu prasy:

podświetlone cofnij

Czy ktoś ma pomysł, jak to zrobić w Vimie?

(Mam już wtyczkę Gundo, chcę tylko sprawić, by domyślne cofanie było bardziej płynne)

Edycja : Wtyczka undotree działa ( Gundo nie wyróżnia zmian), wystarczy użyć UndotreeTogglepolecenia, a wszystkie przyszłe zmiany w pliku zostaną podświetlone.

tjbrn
źródło
Dobry pomysł. Możesz utworzyć wyróżnienie za pomocą matchadd(), ale nieco trudniejsze jest ustalenie, które części pliku uległy zmianie.
joeytwiddle
Być może zapisanie do tymczasowego bufora / pliku przed cofnięciem, a następnie do drugiego bufora / pliku po cofnięciu i wyróżnienie nowych różnic po wyczyszczeniu (lub zmianie koloru) poprzednich. Może spowolnić w przypadku dużych plików.
VanLaser,
UndoTree faktycznie podświetla zmienione linie , ale nie robi tego w czasie rzeczywistym. Myślę, że używa GNU diff. Uzyskanie szczegółowości słów byłoby dodatkowym krokiem (np. Linie podziału przy podziale słów , różnice, rekombinowanie linii).
joeytwiddle
Te wtyczki zbliżają się, ale nadal są oparte na liniach : smeargle może podświetlać linie zmienione od ostatniego zapisu. zmiany Wtyczka zaznacza zmienione linie (w tym usunięcia) w rynnie po lewej stronie.
joeytwiddle
1
@joeytwiddle, zmiany Wtyczka może również wyróżnić region ostatniej zmiany
Christian Brabandt

Odpowiedzi:

6

Nowe rozwiązanie

Możesz zobaczyć swoje ostatnie zmiany za pomocą :changespolecenia. Możesz więc wyszukać ostatnią zmianę linii za pomocą wyrażenia regularnego, a następnie zastosować linię matchadd()zgodnie z sugestią @joeytwiddle.

Oto kod:

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

Uwaga :

  • Ta funkcja dodaje tylko nowe wyróżnienie bez usuwania starego, więc najpierw musisz usunąć stary. Dzięki tej clearmatchesfunkcji możesz usunąć dopasowania przed dodaniem nowego. Ostrożnie, usunie WSZYSTKIE dopasowania. Jeśli chcesz uzyskać większą szczegółowość, możesz zapisać dopasowanie i usunąć je ręcznie:

na przykład

function! DiffWithPrevious()
  call matchdelete(m)
  ... 
  let m = matchadd('TemporalDiff', '\%'.line.'l')
endfunction
  • Po kilku testach odkryłem, że działa tylko w przypadku zmiany jednej linii.

Bibliografia :


Stare rozwiązanie

Oto możliwe rozwiązanie, zainspirowane głównie bieżącym buforem Diff i oryginalnym plikiem :

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

Chodzi o to, aby różnicować plik z plikiem w systemie, aby cofnąć ostatnią zmianę, napisać ją, powtórzyć zmianę lasu i wykonać różnicę.

Myślę, że to powinno wystarczyć do czasowych wizualizacji różnic czasowych.

nobe4
źródło
istnieje sposób na wyczyszczenie komunikatu „bufor” w DiffWithPrevious ()? Chciałbym, aby funkcja wyróżniła tylko ostatnie zmiany, ale wyróżnienie kumuluje się z czasem, próbuję czegoś takiego jak wiadomość = 0 lub wiadomość = "", ale bez powodzenia.
tjbrn
Oczywiście tak, pozwól mi zaktualizować swoją odpowiedź.
nobe4,
3

Sprawdź wtyczkę zmian i upewnij się, że ustawiłeś zmienną g:changes_linehi_diffna 1

Christian Brabandt
źródło
2

Dla kogoś, kto próbuje tego samego ze mnie, to jest najbliższe, do którego dotarłem dzięki odpowiedziom.

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
tjbrn
źródło