Okay, oto najlepsze, co mogę wymyślić. Ta funkcja zaczyna się w górnej części bieżącego bufora i przy użyciu ruchu ]c
przechodzi przez zmiany aż do momentu, gdy ]c
przestanie działać. Zwraca liczbę zmian (lub 0
, jeśli kursor, jeśli nie jest to bufor diff).
function! CountDiffs()
let winview = winsaveview()
let num_diffs = 0
if &diff
let pos = getpos(".")
keepj sil exe 'normal! G'
let lnum = 1
let moved = 1
while moved
let startl = line(".")
keepj sil exe 'normal! [c'
let moved = line(".") - startl
if moved
let num_diffs+=1
endif
endwhile
call winrestview(winview)
call setpos(".",pos)
endif
return num_diffs
endfunction
Wygląda na to, że działa dobrze i nie jest zauważalnym działaniem wydajności, jeśli jest uwzględniony w mojej linii statusu.
Jeśli chodzi o znalezienie "numeru" aktualnej zmiany, oto funkcja, która używa ruchu wstecznego [c
, aby zliczyć liczbę zmian przed pozycją kursora. Zwrócona wartość nie jest całkiem poprawna ... Myślę, że może powinna zwrócić tylko liczbę, jeśli kursor znajduje się "w" zmienionym tekście, a nie po pierwszym wierszu zmiany.
function! CurrentDiff()
if &diff
let num_diff = 0
let winview = winsaveview()
let pos = getpos(".")
let moved = 1
while moved
let startl = line(".")
keepj sil exe 'normal! [c'
let moved = line(".") - startl
if moved
let num_diff+=1
endif
endwhile
call winrestview(winview)
call setpos(".",pos)
return num_diff
endif
endfunction
Ponownie wygląda na to, że zachowuje się w mojej linii statusu i nie wpływa na ruch kursora. Liczby aktualizują się prawidłowo, ponieważ zmiany są również kopiowane/z bufora.
Po usunięciu problemów mogę rozważyć przesłanie tego jako wtyczki na stronie Vima.
Czy masz na myśli liczbę * bryłek * (lub * zmian *, jak nazywa je 'vim')? –
Tak, liczba zmian. –