2012-06-15 18 views
16

Podczas porównywania dwóch plików w (g) vim, czy można wyświetlić całkowitą liczbę zmian? Przypuszczam, że jest to równoważne liczeniu liczby fałd, ale nie wiem, jak to zrobić.Vimdiff: wyświetlanie całkowitej liczby zmian

Idealnie chciałbym wiadomość, która mówi coś takiego jak "Change 1 of 12", który będzie aktualizować, jak przełączyłem się przez zmiany z ]c.

Mam ogromny sukces, przekształcając niektórych członków mojego biura w cuda Vima, ale Vimdiff to konsekwentny bugbear.

+0

Czy masz na myśli liczbę * bryłek * (lub * zmian *, jak nazywa je 'vim')? –

+0

Tak, liczba zmian. –

Odpowiedz

1

Oto nieco bardziej wyrafinowane rozwiązanie. Używa tej samej techniki co moja poprzednia odpowiedź do zliczania różnic, ale przechowuje pierwszą linię każdego kawałka na liście przypisanej globalnej zmiennej g:diff_hunks. Następnie liczbę porcji poniżej kursora można znaleźć, znajdując pozycję numeru linii na liście. Zauważ też, że ustawiłem nocursorbind i noscrollbind i zresetowałem je na końcu, aby upewnić się, że nie przerwiemy przewijania myszy w oknach diff.

function! UpdateDiffHunks() 
    setlocal nocursorbind 
    setlocal noscrollbind 
    let winview = winsaveview() 
    let pos = getpos(".") 
    sil exe 'normal! gg' 
    let moved = 1 
    let hunks = [] 
    while moved 
     let startl = line(".") 
     keepjumps sil exe 'normal! ]c' 
     let moved = line(".") - startl 
     if moved 
      call add(hunks,line(".")) 
     endif 
    endwhile 
    call winrestview(winview) 
    call setpos(".",pos) 
    setlocal cursorbind 
    setlocal scrollbind 
    let g:diff_hunks = hunks 
endfunction 

Funkcja UpdateDiffHunks() powinien być aktualizowany, gdy bufor diff jest modyfikowana, ale uważam, że to wystarczy, aby mapować do CursorMoved i BufEnter.

function! DiffCount() 
    if !exists("g:diff_hunks") 
     call UpdateDiffHunks() 
    endif 
    let n_hunks = 0 
    let curline = line(".") 
    for hunkline in g:diff_hunks 
     if curline < hunkline 
      break 
     endif 
     let n_hunks += 1 
    endfor 
    return n_hunks . '/' . len(g:diff_hunks) 
endfunction 

Wyjście DiffCount() może być stosowany w linii stanu lub związane z poleceniem.

1

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.

Powiązane problemy