突出显示更改的行和每个更改的行中更改的字节

开源项目Trac有一个很好的差异荧光笔 – 突出变化的行和每个变化的行更改字节 ! 有关示例,请参阅https://trac.transmissionbt.com/changeset/12148或http://trac.gajim.org/changeset/297ad7711d20bfee1491768640d9bc5384464363 。

有没有办法使用相同的颜色突出显示(即更改行和更改的字节 )在bashterminal,git或vim 的差异输出(补丁文件)

我分享了可能有帮助的protip,这里是https://coderwall.com/p/ydluzg

diff-highlight Perl contrib脚本产生的输出与Trac截图的输出非常相似,Trac可能使用它:

在这里输入图像说明

安装时使用:

 wget https://raw.githubusercontent.com/git/git/fd99e2bda0ca6a361ef03c04d6d7fdc7a9c40b78/contrib/diff-highlight/diff-highlight && chmod +x diff-highlight 

diff-highlight文件移动到~/bin/目录(或者$PATH所在的位置),然后将以下内容添加到~/.gitconfig

 [pager] diff = diff-highlight | less log = diff-highlight | less show = diff-highlight | less 

@cirosantillibuild议单一粘贴安装:

 cd ~/bin curl -O https://raw.githubusercontent.com/git/git/fd99e2bda0ca6a361ef03c04d6d7fdc7a9c40b78/contrib/diff-highlight/diff-highlight chmod +x diff-highlight git config --global pager.log 'diff-highlight | less' git config --global pager.show 'diff-highlight | less' git config --global pager.diff 'diff-highlight | less' 

在使用git diff或者git log和其他可能的情况下,使用选项--word-diff=color (还有其他字模式差异)

我使用--color-words选项,它适用于我:

 $ git diff --color-words | less -RS 

你想要的行为现在可以在git中使用(正如在naught101的评论中指出的那样)。 要启用它,你需要设置你的寻呼机

 perl /usr/share/doc/git/contrib/diff-highlight/diff-highlight | less 

其中/usr/share/doc/git/contrib/diff-highlight/diff-highlight是Ubuntu 13.10上的高亮显示器脚本的位置(我不知道它为什么在doc文件夹中)。 如果您的系统上不存在,请尝试使用locate diff-highlight来查找它。 请注意突出显示脚本不可执行(至less在我的机器上),因此需要perl

要总是使用各种diff-like命令的荧光笔,只需将以下内容添加到~/.gitconfig文件中即可:

 [pager] log = perl /usr/share/doc/git/contrib/diff-highlight/diff-highlight | less show = perl /usr/share/doc/git/contrib/diff-highlight/diff-highlight | less diff = perl /usr/share/doc/git/contrib/diff-highlight/diff-highlight | less 

我把这个添加为一个新的答案naught101的评论是埋藏的,因为设置是不是很微不足道,因为它应该是,至less在Ubuntu的版本,我有自述文件中的说明不起作用。

diff-so-fancy是为人眼devise的diff增亮器。

它删除了导致剪切/粘贴的前导+ / - ,并在文件之间创build清晰的部分。

有色的git (左)与diff-so-fancy (右 – 注意字符级的亮点):

不同的花式输出

如果你想diff-so-fancy (右侧)输出,但不限制在git仓库中的文件,请将以下函数添加到.bashrc以在任何文件上使用它:

 dsf() { git diff --no-index --color "$@" | diff-so-fancy; } 

例如:

 dsf original changed-file 

字符级突出显示和标准diff格式

如果你不喜欢diff-so-fancy的非标准格式,但仍然需要字符级别的git高亮显示,可以使用diff-highlight来获取git的输出,并生成非常标准的diff format输出:

diff-highlight截图

要从git默认使用它,添加到你的.gitconfig

 [color "diff-highlight"] oldNormal = red bold oldHighlight = red bold 52 newNormal = green bold newHighlight = green bold 22 [pager] diff = diff-highlight | less -FRXsu --tabs=4 

[pager]部分告诉git将已经着色的输出pipe道输出为diff-highlight ,在字符级别着色,然后用较less的页面(如果需要的话)页面输出,而不是使用默认的less

Emacs具有ediff-patch-bufferfunction,可以满足您的需求。

在emacstypesESC-x,ediff-patch-buffer中打开未打补丁的文件。

按照提示,你应该看到你的文件的修补和原始版本的突出比较。

根据你的评论,以下将会给你一个只需要dwdiff的bash解决scheme:

 #!/bin/bash paste -d'\n' <(dwdiff -2 -L -c <(cat $2) <(patch $2 -i $1 -o -)) <(dwdiff -1 -L -c <(cat $2) <(patch $2 -i $1 -o -))| uniq 

Diffy

GitLab使用Diffy https://github.com/samg/diffy(Ruby )来实现类似于GitHub和diff-highlight的输出:

在这里输入图像说明

Diffy使用相同的algorithmad Git来创builddiff,并支持不同types的输出,包括GitLab使用的HTML输出:

 gem install diffy echo ' require "diffy" puts Diffy::Diff.new("abc\n", "a B c\n").to_s(:html) ' | ruby 

输出:

 <div class="diff"> <ul> <li class="del"><del>a <strong>b</strong> c</del></li> <li class="ins"><ins>a <strong>B</strong> c</ins></li> </ul> </div> 

请注意已更改的字节添加了多么strong

是的,Vim会这样做,包括在一行内改变文本的高亮显示。
有关如何区分文件的更多细节,请参阅:h diff:h 08.7

Vim使用相当简单的algorithm来突出显示。 它会search第一个已更改的字符,然后是最后一个已更改的字符,并简单地突出显示它们之间的所有字符。
这意味着每行不能有多个突出显示 – Vim中的许多devise决策都将优先考虑效率。

vimdiff file1 file2将显示两个文件之间的字符差异。

vimdiff是vim中包含的一个diff工具。 (Vim应该已经用+ diff选项编译,确保你可以检查:version

你也可以从vim里面启动它。 请参阅:help diff以获取更多信息和命令。