代码之家  ›  专栏  ›  技术社区  ›  Adam Monsen

如何在统一的diff文件中可视化每个字符的差异?

  •  108
  • Adam Monsen  · 技术社区  · 14 年前

    假设我得到一个补丁 git format-patch . 文件基本上是一个统一的diff,带有一些元数据。如果我在vim中打开文件,我可以看到哪些行已被修改,但是我看不到哪些行已被修改。 文字 在变化的行里不一样。有人知道一种方法(在Vim中,或者在Ubuntu上运行的其他一些免费软件)来可视化每个字符的差异吗?

    每个字符的diff可视化的计数器示例是在执行时 vimdiff a b .

    更新时间:2010年11月12日星期五22:36:23

    diffpatch is helpful 对于使用单个文件的场景。

    更新时间:2016年6月16日星期四17:56:10 UTC

    退房 diff-highlight in git 2.9 . 这个脚本有 确切地 我最初想要的。

    7 回复  |  直到 6 年前
        1
  •  13
  •   itsjeyd    10 年前

    考虑到你在问题中提到了Vim,我不确定这是否是你想要的答案:)但是Emacs可以做到这一点。打开包含diff的文件,确保您在 diff-mode (如果文件名为 foo.diff foo.patch 这是自动发生的;否则键入 M—X 微分模式 雷特 )去你感兴趣的那家酒吧打 C-C-C-B 对于 refine-hunk . 或者一次一大块地用 M—N 这将自动进行精炼。

        2
  •  154
  •   yingted Amit    12 年前

    在Git中,可以合并而不提交。首先合并修补程序,然后执行以下操作:

    git diff --word-diff-regex=.
    

    注意等号后面的圆点。

        3
  •  117
  •   wjandrea Aramich100    6 年前

    有些版本的输出噪声比 git diff --word-diff-regex=<re> 这需要的打字量比,但相当于, git diff --color-words --word-diff-regex=<re> .

    简单(是否突出显示空间更改):

    git diff --color-words
    

    简单(突出显示单个字符更改;不突出显示空间更改):

    git diff --color-words=.
    

    更复杂(是否突出显示空间更改):

    git diff --color-words='[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'
    

    一般来说:

    git diff --color-words=<re>
    

    哪里 <re> 是一个regexp,用于定义“单词”以标识更改。

    因为它们给改变后的“单词”上色,而使用 --word-diff-regex=<re> 环绕着与颜色匹配的“单词” -/+ 标记。

        4
  •  43
  •   Justin M. Keyes    6 年前
    git diff --color-words="[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+"
    

    上面的regex( from Thomas Rast )在标点/字符级别上分离不同片段是否做得很好(同时不会像 --word-diff-regex=. )

    我发布了结果输出的屏幕截图 here .


    更新:

    This article 有一些很好的建议。具体来说, contrib/ git repo的树有一个 diff-highlight 显示细粒度突出显示的Perl脚本。

    快速开始使用:

    $ curl https://git.kernel.org/cgit/git/git.git/plain/contrib/diff-highlight/diff-highlight > diff-highlight
    $ chmod u+x diff-highlight
    $ git diff --color=always HEAD~10 | diff-highlight | less -R
    
        5
  •  4
  •   Nick Volynkin    7 年前

    如果您不反对安装nodejs,那么有一个名为“diff so fancy”的包。( https://github.com/so-fancy/diff-so-fancy ,非常容易安装,并且工作正常:

    npm install -g diff-so-fancy
    git diff --color | diff-so-fancy | less -R
    

    编辑:刚刚发现它实际上是官方差异突出显示的包装器…至少像我这样的Perlphobes更容易安装,而且Github页面有很好的文档记录:)

        6
  •  3
  •   thegeek    14 年前

    我不知道每个字符的差异工具,但有一个每个字的差异工具:wdiff。

    参考实例 Top 4 File Difference Tools on UNIX / Linux – Diff, Colordiff, Wdiff, Vimdiff .

        7
  •  1
  •   Adam Monsen    14 年前

    经过一点研究,我注意到这个问题最近在主VIM邮件列表中出现了两次。这个 NrrwRgn plugin 提到 both times (制作两个狭窄区域并对其进行区分)。使用ChristianBrabandt所描述的nrrwrgn比解决方案更像是一种权宜之计,但也许这已经足够好了。

    我尝试了nrrwrgn,它和:diffthis一起,对于说明单个文件部分中每个字符的差异确实很有用。但它需要很多次按键。我的vimscript已经生锈了,但它很可能是脚本化的。也许可以增强nrrwrgn以提供所需的功能。

    思想?