当我有一个差异时,如何给它上色以使其看起来不错?我希望在命令行使用它,因此请不要使用GUI解决方案。
当我有一个差异时,如何给它上色以使其看起来不错?我希望在命令行使用它,因此请不要使用GUI解决方案。
Answers:
手册页中diff
没有建议从内部解决着色问题。请考虑使用colordiff
。它是一个包装器diff
,与diff产生相同的输出,不同之处在于它使用彩色语法突出显示来增强输出以提高可读性:
diff old new | colordiff
要不就:
colordiff old new
安装:
sudo apt-get install colordiff
brew install colordiff
或port install colordiff
less -R
正确显示颜色的转义序列。
-y
启用选项)vimdiff
below下面的建议可能是更好的方法
colordiff
效果很好svn diff | colordiff
(例如,在仅包含差异而不是两个文件被差异化的情况下)。
-y
)支持。
使用Vim:
diff /path/to/a /path/to/b | vim -R -
更好的是,VimDiff(或简称为VimDiffvim -d
)将并排显示两个,三个或四个文件之间的差异。
vim -d /path/to/[ab]
vimdiff file1 file2 file3 file4
zsh
?我不认识=(...)
构造。其次,我已经diff -ur a b
牢记。
实际上,似乎还有另一种选择(当遇到上述问题时,我最近才注意到):
git diff --no-index <file1> <file2>
# output to console instead of opening a pager
git --no-pager diff --no-index <file1> <file2>
如果周围有Git(无论如何您可能已经在使用它),那么即使文件本身不受版本控制,也可以将其用于比较。如果默认情况下未为您启用,那么在这里启用颜色支持似乎比前面提到的某些解决方法容易得多。
git diff <(xxd file1) <(xxd filed)
不起作用。
git help diff
。因此,如果您的git diff变空了,请尝试cd
您所在的位置。
git config color.diff auto
git diff --no-index
来比较两个文件。
diff --color
选项已添加到GNU diffutils 3.4(2016-08-08)
这是默认值 diff
大多数发行版实现,很快就会得到它。
Ubuntu 18.04具有diffutils
3.6,因此具有它。
在3.5上看起来像这样:
经过测试:
diff --color -u \
<(seq 6 | sed 's/$/ a/') \
<(seq 8 | grep -Ev '^(2|3)$' | sed 's/$/ a/')
显然已在提交c0fa19fe92da71404f809aafb5f51cfd99b1bee2(2015年3月)中添加。
字级差异
喜欢diff-highlight
。功能请求似乎不太可能:https : //lists.gnu.org/archive/html/diffutils-devel/2017-01/msg00001.html
相关主题:
ydiff
但是,请参见下文。
ydiff
并排字级差异
https://github.com/ymattw/ydiff
这是涅磐吗?
python3 -m pip install --user ydiff
diff -u a b | ydiff -s
结果:
如果线条太窄(默认为80列),则适合使用以下屏幕:
diff -u a b | ydiff -w 0 -s
测试文件的内容:
一个
1
2
3
4
5 the original line the original line the original line the original line
6
7
8
9
10
11
12
13
14
15 the original line the original line the original line the original line
16
17
18
19
20
b
1
2
3
4
5 the original line teh original line the original line the original line
6
7
8
9
10
11
12
13
14
15 the original line the original line the original line the origlnal line
16
17
18
19
20
ydiff
Git集成
ydiff
无需任何配置即可与Git集成。
在git仓库内部,而不是git diff
,您可以执行以下操作:
ydiff -s
而不是git log
:
ydiff -ls
在Ubuntu 16.04,git 2.18.0,ydiff 1.1上进行了测试。
There is no word-highlighting, yet
-是否有任何更新?这就是我要问这个问题的原因(我想要grep --color
diff输出)。
git diff --color
。在ssh上工作时很有用。
diff --color=always | less -R
对于那些由于无法控制的疯狂约束而无法选择a yum install colordiff
或an的apt-get install colordiff
情况,或者您只是感到疯狂,可以使用sed线重新发明轮子:
sed 's/^-/\x1b[41m-/;s/^+/\x1b[42m+/;s/^@/\x1b[34m@/;s/$/\x1b[0m/'
将其扔到一个shell脚本中,并通过它传递统一的diff输出。
它使块标记变成蓝色,并分别以绿色和红色背景突出显示新的/旧的文件名以及添加/删除的行。1 它将使尾随空间2的变化比colordiff更加容易显现。
1顺便说一句,突出显示文件名与修改后的行相同的原因是,要正确区分文件名和修改后的行需要正确解析diff格式,而使用正则表达式则无法解决。突出显示它们的效果在视觉上“足够好”,并使问题变得微不足道。也就是说,有一些有趣的微妙之处。
2但不要尾随制表符。显然,至少在我的xterm中,选项卡没有设置背景。它确实使制表符与空间的更改脱颖而出。
sed "s/^-/`echo -e \"\x1b\"`[41m-/;s/^+/`echo -e \"\x1b\"`[42m+/;s/^@/`echo -e \"\x1b\"`[34m@/;s/$/`echo -e \"\x1b\"`[0m/"
尽管我希望有更好的方法)。
您可以更改subversion配置以使用colordiff
〜/ .subversion / config.diff
### Set diff-cmd to the absolute path of your 'diff' program.
### This will override the compile-time default, which is to use
### Subversion's internal diff implementation.
-# diff-cmd = diff_program (diff, gdiff, etc.)
+diff-cmd = colordiff
彩色字级 diff
输出
这是使用以下脚本和diff-highlight可以执行的操作:
#!/bin/sh -eu
# Use diff-highlight to show word-level differences
diff -U3 --minimal "$@" |
sed 's/^-/\x1b[1;31m-/;s/^+/\x1b[1;32m+/;s/^@/\x1b[1;34m@/;s/$/\x1b[0m/' |
diff-highlight
(感谢@ retracile的回答为sed
高亮)
我使用grc
(通用选色器),它使您可以为包括在内的许多命令的输出着色diff
。
这是一个python脚本,可以包装在任何命令周围。因此diff file1 file2
,您可以调用而不是调用grc diff file1 file2
来查看彩色输出。我已经使用别名diff
来简化grc diff
它。
fork()
尽管可能与WSL一起使用,但由于调用而无法在具有mingw / cygwin的Windows上使用。
下面是另一种解决方案,它调用sed
插入相应的ANSI转义序列为颜色来显示+
,-
和@
在红色,绿色和青色线,分别。
diff -u old new | sed "s/^-/$(tput setaf 1)&/; s/^+/$(tput setaf 2)&/; s/^@/$(tput setaf 6)&/; s/$/$(tput sgr0)/"
与该问题的其他解决方案不同,此解决方案没有明确说明ANSI转义序列。相反,它调用tput setaf
和tput sgr0
命令来生成ANSI转义序列,分别设置适当的颜色和重置终端属性。
要查看的每个参数的可用颜色tput setaf
,请使用以下命令:
for i in {0..255}; do tput setaf $i; printf %4d $i; done; tput sgr0; echo
这是输出的样子:
这是tput setaf
and tput sgr0
命令生成适当的ANSI转义序列的证据:
$ tput setaf 1 | xxd -g1
00000000: 1b 5b 33 31 6d .[31m
$ tput setaf 2 | xxd -g1
00000000: 1b 5b 33 32 6d .[32m
$ tput setaf 6 | xxd -g1
00000000: 1b 5b 33 36 6d .[36m
$ tput sgr0 | xxd -g1
00000000: 1b 28 42 1b 5b 6d .(B.[m
由于wdiff
接受在插入和删除的开头和结尾都指定字符串的args,因此可以将ANSI颜色序列用作这些字符串:
wdiff -n -w $'\033[30;41m' -x $'\033[0m' -y $'\033[30;42m' -z $'\033[0m' file1 file2
例如,这是比较两个CSV文件的输出:
来自https://www.gnu.org/software/wdiff/manual/html_node/wdiff-Examples.html的示例
colordiff
现在(1.0.16)可以理解了wdiff
,所以您也可以只管道:wdiff -n f1 f2 | colordiff
。wdiff
应该合并到diffutils ...
在Ubuntu的最新版本git上,您可以使用以下命令启用diff-highlighting:
sudo ln -s /usr/share/doc/git/contrib/diff-highlight/diff-highlight /usr/local/bin
sudo chmod a+x /usr/share/doc/git/contrib/diff-highlight/diff-highlight
然后将其添加到您的.gitconfig
:
[pager]
log = diff-highlight | less
show = diff-highlight | less
diff = diff-highlight | less
该脚本可能位于其他发行版中的其他位置,您可以locate diff-highlight
用来查找位置。