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

假设我使用git format-patch创build了一个git format-patch 。 该文件基本上与一些元数据统一差异。 如果我在Vim中打开文件,我可以看到哪些行已被修改,但是我看不到哪些字符在更改的行中有所不同。 有没有人知道一种方式(在Vim或其他一些在Ubuntu上运行的免费软件)来显示每个字符的差异?

每个字符差异可见的计数器示例是在执行vimdiff ab

更新周五11月12日22:36:23 UTC 2010

diffpatch对于使用单个文件的场景很有帮助 。

更新Thu Jun 16 17:56:10 UTC 2016

在git 2.9中检查diff-highlight 。 这个脚本完全是我最初寻求的。

考虑到你在这个问题中对Vim的引用,我不确定这是否是你想要的答案:)但Emacs可以做到这一点。 打开包含diff的文件,确保处于diff-mode (如果文件名为foo.difffoo.patch自动发生,否则inputMx diff-mode RET ),转到您感兴趣的模块并且击中了Cc Cbrefine-hunk 。 或者用一次一个文件地穿过文件; 这将自动完成。

在git中,你可以合并而不提交。 先合并你的补丁,然后做:

 git diff --word-diff-regex=. 

注意等号后面的点。

(评论转换为每个请求的答案)

git diff --word-diff-regex=<re>相比,输出噪声较小的版本需要的inputless于git diff --color-words --word-diff-regex=<re>

简单(突出显示空间变化):

 git diff --color-words 

简单(突出个人angular色变化;不突出显示空间变化):

 git diff --color-words=. 

更复杂(突出空间变化):

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

一般来说:

 git diff --color-words=<re> 

其中<re>是为了识别变化而定义“词”的正则expression式。

这些都不那么嘈杂,因为它们为变化的“单词”着色,而仅使用--word-diff-regex=<re>围绕具有彩色-/+标记的匹配“单词”。

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

上面的正则expression式( 来自Thomas Rast )在标点符号/字符级别上分离差异片段(虽然不像--word-diff-regex=.那样吵杂)。

我在这里发布了结果输出的屏幕截图。


更新:

本文有一些很好的build议。 具体来说,git仓库的contrib/ tree有一个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 

如果您对安装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 

编辑:刚刚发现它实际上是官方diff-highlight的包装…至less它更容易安装像我这样的perlophobes和GitHub页面很好地logging:)

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

请参阅UNIX / Linux上的前4个文件差异工具 – 差异,Colordiff,Wdiff,Vimdiff 。

经过一番研究,我发现这个问题最近在主Vim邮件列表上出现了两次。 NrrwRgn插件被提及两次 (使两个狭窄的地区和差异)。 使用Christian Brabandt描述的NrrwRgn更像是一种解决方法,而不是解决scheme,但也许这已经足够了。

我尝试了NrrwRgn,它与:diffthis一起,对于说明单个文件中每个字符的差异是非常有用的。 但它花了很多击键。 我的Vimscript是相当生锈的,但它可能是脚本。 也许NrrwRgn可以被增强来提供所需的function。

思考?