2012-06-15 3 views
16

(g) vim에서 두 파일을 비교할 때 총 변경 횟수를 표시 할 수 있습니까? 이것은 폴드 수를 계산하는 것과 같다고 생각하지만, 어떻게해야할지 모르겠습니다.Vimdiff : 총 변경 횟수 표시

이상적으로 나는 ]c으로 변경 사항을 순환하면서 업데이트 할 것이라고 말하는 메시지를 "Change 1 of 12"과 같이 표시하고 싶습니다.

나는 내 사무실의 일부 구성원을 Vim의 경이로 변환하는 데 성공했지만 Vimdiff는 일관된 버그 베어입니다.

+0

* hunks * (또는 vim이 호출하는 * 변경 사항 *)의 개수를 의미합니까? –

+0

예, 변경 횟수입니다. –

답변

1

다음은 좀 더 세련된 해결책입니다. 그것은 이전의 답과 동일한 기술을 사용하여 diff를 계산하지만 전역 변수 g:diff_hunks에 할당 된 목록에 각 행의 첫 번째 행을 저장합니다. 그런 다음 목록에서 행 번호의 위치를 ​​찾아서 커서 아래의 헌크 수를 찾을 수 있습니다. 또한 nocursorbindnoscrollbind을 설정하고 마지막에 재설정하여 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 

함수 UpdateDiffHunks()은 DIFF 버퍼가 수정 될 때마다 업데이트하지만 충분한 CursorMovedBufEnter에 매핑 발견한다.

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 

DiffCount()의 출력은 statusline에서 사용될 수있는 명령 또는 연계.

1

좋아요, 여기에 나와 함께 할 수있는 최선이 있습니다. 이 함수는 현재 버퍼의 맨 위에서 시작하여 ]c 동작을 사용하여 더 이상 효과가없는 때까지 변경 사항을 이동합니다. 변경 횟수를 반환합니다 (커서가 diff 버퍼가 아닌 경우 커서가 0).

내 상태 표시 줄에 포함될 때 정상적으로 작동하며 눈에 띄는 성능 저하가 없습니다.

현재 변경의 "번호"를 찾는 것과 마찬가지로 커서 위치 이전의 변경 횟수를 계산하기 위해 역방향 [c 동작을 사용하는 함수가 있습니다. 반환 된 값을 꽤 옳지 않다 ... 나는 커서가 변경된 텍스트 내에서 "변경된"텍스트의 첫 번째 라인 이후가 아닌 숫자 인 경우에만 반환해야한다고 생각합니다.

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 

다시 말하지만, 내 상태 표시 줄에서 동작하는 것으로 보이며 커서의 움직임에는 영향을주지 않습니다. 변경 사항이 버퍼에서 /로 복사됨에 따라 숫자가 제대로 업데이트됩니다.

일단 문제가 해결되면 Vim 웹 사이트에서 플러그인으로 업로드하는 것이 좋습니다.