Colored word-based diff
diff
is the standard utility for displaying differences between text
files. It is most useful for source code because it displays lines that differ
between files. Line-based diffs are less useful for documents. Fortunately
the GNU utility wdiff
provides
word-based diffs.
cwdiff
is a wrapper to wdiff
that can be used instead of diff
to get colored, word-based
diffs with context. Version control systems can easily be coerced into using
this wrapper instead of diff
. Examples: svnwdiff
, bzrwdiff
.
Git users have an easier life, they can use the built-in
--color-words
or --word-diff
options. In fact, users of all
version control systems can use git’s diff tool: gitcwdiff is a shell script wrapper that uses git
instead of wdiff to do the work. This wrapper could replace
cwdiff in the above wrappers for bzr
and svn
. This alternative
wrapper will be useful if git is installed but wdiff isn’t (more and more
likely these days).
Viewing output in a pager
If you want to page through colored text in a terminal using
less
, you’ll need to use the -R
option or set
LESS=-R
in your shell configuration. Further aside:
my zsh
configuration file contains a global alias for
conveniently paging through colorized output:
alias -g L='2>&1 |less -i -R'
To see the differences in a latex file between revisions 1 and 2 I do one of:
bzrwdiff -r1..2 paper.tex L svnwdiff -r1:2 paper.tex L
and get nicely paging, searchable, colored word-based diffs.
Old version
The cwdiff
wrapper above colorizes commands by giving wdiff escape
codes generated by tput
. I used to use colordiff
, but its support
for colorizing wdiff
is slightly buggy. Fragments like “{+He
said that it [the widget] needed work+}
” are incorrectly colored,
and square brackets appear frequently in LaTeX. I submitted a patch that attempts to improve things, but two
years later it hadn’t been incorporated. You
can get the resulting fixed colordiff script that I used to use,
and the cwdiff.old
script that used it.