如何显示Vim中的更改总数’;s差模?

如何显示Vim中的更改总数’;s差模?,vim,diff,Vim,Diff,在Vim中区分两个文件时,是否可以显示更改的总数?我想,这相当于计算折叠的数量,但我也不知道怎么做 理想情况下,我希望看到一条消息,上面写着“12个更改中的1个”,当我使用]c循环更改时,该消息会更新 我在将我办公室的一些成员转化为Vim的奇迹方面取得了巨大成功,但Vimdiff是一个始终如一的问题。好的,下面是我能想到的最好的方法。此功能从当前缓冲区的顶部开始,使用]c运动,它在更改中移动,直到]c不再生效。它返回更改的数量(如果光标不是差异缓冲区,则返回0) 它似乎工作正常,当包含在我的状态

在Vim中区分两个文件时,是否可以显示更改的总数?我想,这相当于计算折叠的数量,但我也不知道怎么做

理想情况下,我希望看到一条消息,上面写着“12个更改中的1个”,当我使用
]c
循环更改时,该消息会更新


我在将我办公室的一些成员转化为Vim的奇迹方面取得了巨大成功,但Vimdiff是一个始终如一的问题。

好的,下面是我能想到的最好的方法。此功能从当前缓冲区的顶部开始,使用
]c
运动,它在更改中移动,直到
]c
不再生效。它返回更改的数量(如果光标不是差异缓冲区,则返回
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网站上的一个插件。

这里有一个稍微精炼的解决方案。它使用与我之前的答案相同的技术来计算差异,但是它将每个HOUK的第一行存储在一个全局变量<代码> G:DeffyHunks中。通过在列表中查找行号的位置可以找到光标下方的大块。另外请注意,我设置了

nocursorbind
noscrollbind
,并在末尾重置它们,以确保不会破坏鼠标在不同窗口中的滚动

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()
,但我发现它足以将其映射到
CursorMoved
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
函数!DiffCount()
如果!存在(“g:diff_hunks”)
调用UpdateDiffHunks()
恩迪夫
让n_hunks=0
让曲线=直线(“.”)
对于g中的hunkline:diff_hunks
如果curline

DiffCount()
的输出可以在statusline中使用,也可以绑定到一个命令。

你是指大块的数量(或者在
vim
调用它们时进行更改)?谢谢,它非常有用,但我只有在手动执行时才成功地使它在vim/nvim中工作,如
:echo DiffCount()
要在statusline中显示结果,如
1/10
,如何使其自动显示在状态行中,如您所说的
CursorMoved
。我使用了
autocmd CursorMoved,BufEnter*:echo DiffCount()
,但它始终显示
0/0
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