vim - 如何在Vim的diff模式下显示变化总数?

标签 vim diff

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

理想情况下,我想要一条消息,内容类似于“更改 1 个,共 12 个”,该消息会在我使用 ]c 循环更改更改时更新。

我取得了巨大成功,让我办公室的一些成员开始接受 Vim 的魅力,但 Vimdiff 一直是一个令人头疼的问题。

最佳答案

好吧,这是我自己能想到的最好的办法。此函数从当前缓冲区的顶部开始,并使用 ]c 运动来移动更改,直到 ]c 不再产生效果。它返回更改的数量(如果光标不是差异缓冲区,则返回 0)。

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

它似乎工作正常,并且在包含在我的状态行中时不会对性能造成明显影响。

至于查找当前更改的“数量”,这里有一个函数,它使用向后的[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 网站上。

关于vim - 如何在Vim的diff模式下显示变化总数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11046475/

相关文章:

vim - RGB 值如何/在哪里映射到 xterm 颜色代码?它们可以被覆盖吗?

ruby-on-rails - vim 和 Ruby on Rails

Git Commit after merge 打开VIM

.net - 比较 .NET 程序集的 2 个版本?

eclipse - 如何在eclipse中比较两种方法

vim - VIM:删除文件中所有行的特定单词之前的所有字符

Vim 显示垃圾字符

windows - 如何使用 svn 比较两个文件夹并生成报告

linux - 使用 "diff"和 "patch"命令排除二进制文件和目标文件,使用补丁文件进行 FreeScale LTIB 源代码控制

netbeans - 比较 NetBeans 中的本地和远程文件