2012-06-15 36 views
16

Khi phân biệt hai tệp trong (g) vim, có thể hiển thị tổng số thay đổi không? Tôi cho rằng điều này tương đương với việc đếm số nếp gấp, nhưng tôi cũng không biết cách làm như thế.Vimdiff: hiển thị tổng số thay đổi

Lý tưởng nhất là tôi muốn một thông báo có nội dung như "Change 1 of 12" sẽ cập nhật khi tôi đạp xe qua các thay đổi với ]c.

Tôi có thành công lớn trong việc chuyển đổi một số thành viên trong văn phòng của mình thành những điều kỳ diệu của Vim, nhưng Vimdiff là một con bọ nhất quán.

+0

Bạn có nghĩa là số lượng * hunks * (hoặc * thay đổi * như 'vim' gọi chúng) không? –

+0

Có, số lượng thay đổi. –

Trả lời

1

Đây là giải pháp được tinh chỉnh hơn một chút. Nó sử dụng kỹ thuật tương tự như câu trả lời trước của tôi để tính các điểm khác biệt, nhưng nó lưu trữ dòng đầu tiên của mỗi hunk trong một danh sách được gán cho một biến toàn cầu g:diff_hunks. Sau đó, số lượng khối bên dưới con trỏ có thể được tìm thấy bằng cách tìm vị trí của số dòng trong danh sách. Cũng lưu ý rằng tôi đặt nocursorbindnoscrollbind và đặt lại chúng ở cuối để đảm bảo chúng tôi không làm gián đoạn việc cuộn chuột trong cửa sổ khác.

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 

Chức năng UpdateDiffHunks() cần được cập nhật bất cứ khi nào một bộ đệm diff được sửa đổi, nhưng tôi thấy nó đủ để ánh xạ nó vào 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 

Đầu ra của DiffCount() có thể được sử dụng trong dòng trạng thái hoặc gắn với lệnh.

1

Được rồi, đây là cách tốt nhất tôi có thể tự tìm ra. Hàm này bắt đầu ở đầu bộ đệm hiện tại và sử dụng chuyển động ]c nó di chuyển qua các thay đổi cho đến khi ]c không còn có hiệu lực nữa. Nó trả về số lượng thay đổi (hoặc 0 nếu con trỏ nếu nó không phải là bộ đệm khác).

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 

Dường như hoạt động tốt, và không phải là hiệu suất đáng chú ý khi được bao gồm trong trạng thái của tôi.

Đối với việc tìm "số" của thay đổi hiện tại, đây là hàm sử dụng chuyển động lùi [c để đếm số lần thay đổi trước vị trí của con trỏ. Giá trị trả lại không hoàn toàn đúng ... Tôi nghĩ có lẽ nó chỉ trả về một con số nếu con trỏ "nằm trong" văn bản đã thay đổi, thay vì sau dòng đầu tiên của thay đổi.

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 

Một lần nữa, có vẻ như nó hoạt động trong trạng thái của tôi và không ảnh hưởng đến chuyển động của con trỏ. Các con số cập nhật đúng như những thay đổi được sao chép quá/từ bộ đệm.

Khi vấn đề đã được giải quyết, tôi có thể xem xét tải lên đây dưới dạng plugin trên trang web Vim.

Các vấn đề liên quan