2012-06-15 12 views
16

Al distinguir dos archivos en (g) vim, ¿es posible visualizar el número total de cambios? Supongo que esto es equivalente a contar el número de pliegues, pero tampoco sé cómo hacer eso.Vimdiff: visualización del número total de cambios

Idealmente me gustaría recibir un mensaje que diga algo así como "Change 1 of 12" que se actualizará a medida que realice un ciclo de cambios con ]c.

Estoy teniendo un gran éxito al convertir algunos miembros de mi oficina a las maravillas de Vim, pero Vimdiff es un bribón constante.

+0

¿Te refieres a la cantidad de * hunks * (o * cambios * cuando 'vim' los llama)? –

+0

Sí, la cantidad de cambios. –

Respuesta

1

Aquí hay una solución un poco más refinada. Utiliza la misma técnica que mi respuesta anterior para contar las diferencias, pero almacena la primera línea de cada trozo en una lista asignada a una variable global g:diff_hunks. Luego, puede encontrar el número de trozos debajo del cursor al encontrar la posición del número de línea en la lista. También tenga en cuenta que establezco nocursorbind y noscrollbind y los reinicio al final para asegurarme de que no rompa el desplazamiento del mouse en las ventanas de diferencia.

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 

La función UpdateDiffHunks() debe actualizarse cada vez que se modifica un búfer de diferencias, pero me resulta suficiente para asignarlo a CursorMoved y 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 

La salida de DiffCount() se puede utilizar en la línea de estado, o ligado a un comando.

1

Bien, aquí está lo mejor que pude encontrar. Esta función comienza en la parte superior del búfer en uso y utilizando el movimiento ]c se mueve a través de los cambios hasta que ]c ya no tenga un efecto. Devuelve el número de cambios (o 0 si el cursor no es un búfer 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 

Parece que funciona bien, y no es un golpe de rendimiento notable cuando se incluye en mi línea de estado.

En cuanto a encontrar el "número" del cambio actual, aquí hay una función que usa el movimiento hacia atrás [c para contar el número de cambios antes de la posición del cursor. El valor devuelto no es del todo correcto ... Creo que tal vez solo debería devolver un número si el cursor está "dentro" del texto modificado, en lugar de después de la primera línea del cambio.

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 

Una vez más, parece comportarse en mi línea de estado y no afecta el movimiento del cursor. Los números se actualizan correctamente a medida que se copian los cambios/desde el búfer.

Una vez solucionados los problemas, podría considerar cargar esto como un complemento en el sitio web de Vim.

Cuestiones relacionadas