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.
¿Te refieres a la cantidad de * hunks * (o * cambios * cuando 'vim' los llama)? –
Sí, la cantidad de cambios. –