突出显示更改的行和每个更改的行中更改的字节
开源项目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输出:
要从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
以获取更多信息和命令。