NAME

sdif - side-by-side diff viewer for ANSI terminal

SYNOPSIS

sdif file_1 file_2

diff ... | sdif

-i, --ignore-case
-b, --ignore-space-change
-w, --ignore-all-space
-B, --ignore-blank-lines

--[no]number, -n	print line number
--digit=#		set the line number digits (default 4)
--truncate, -t	truncate long line
--[no]onword	fold line on word boundaries
--context, -c, -C#	context diff
--unified, -u, -U#	unified diff

--width=#, -W#	specify width of output (default 80)
--color=when	'always' (default), 'never' or 'auto'
--nocolor		--color=never
--colormap, --cm	specify color map
--colortable	show color table
--[no]256		on/off ANSI 256 color mode (default on)
--mark=position	mark position (right, left, center, side) or no
--column=order	set column order (default ONM)
--view, -v		viewer mode
--ambiguous=s       ambiguous character width (detect, wide, narrow)
--[no]graph		process git --graph output (default on)

--man		display manual page
--diff=s		set diff command
--diffopts=s	set diff command options

--[no]cdif		use ``cdif'' as word context diff backend
--cdifopts=s	set cdif command options
--mecab		pass --mecab option to cdif

DESCRIPTION

sdif is inspired by System V sdiff(1) command. The basic feature of sdif is making a side-by-side listing of two different files. All contents of two files are listed on left and right sides. Center column is used to indicate how different those lines are. No mark means no difference. Added, deleted and modified lines are marked with minus (`-') and plus (`+') character, and wrapped line is marked with period (`.').

1 deleted  -
2 same          1 same
3 changed  -+   2 modified
  wrapped  ..     folded
4 same          3 same
            +   4 added

It also reads and formats the output from diff command from standard input. Besides normal diff output, context diff -c and unified diff -u output will be handled properly. Combined diff format is also supported, but currently limited up to three files.

STARTUP and MODULE

sdif utilizes Perl Getopt::EX module, and reads ~/.sdifrc file if available when starting up. You can define original and default option there. To show the line number always, define like this:

option default -n

Modules under App::sdif can be loaded by -M option without prefix. Next command load App::sdif::colors module.

$ sdif -Mcolors

You can also define options in module file. Read `perldoc Getopt::EX::Module` for detail.

COLOR

Each lines are displayed in different colors by default. Use --no-color option to disable it. Each text segment has own labels, and color for them can be specified by --colormap option. Read `perldoc Getopt::EX::Colormap` for detail.

Standard module -Mcolors is loaded by default, and define several color maps for light and dark screen. If you want to use CMY colors in dark screen, place next line in your ~/.sdifrc.

option default --dark-cmy

Option --autocolor is defined to load -Mautocolor module. It sets --light or --dark option according to the brightness of the terminal screen. You can set preferred color in your ~/.sdifrc like:

option --light --cmy
option --dark  --dark-cmy

If the BRIGHTNESS environment variable is set in a range of 0 to 100 digit, it is used as a screen brightness.

Currently automatic setting by -Mautocolor module works only on macOS Terminal.app and iTerm.app. If you are using other terminal application, set the BRIGHTNESS or write a module.

Option --autocolor is set by default, so override it to do nothing to disable.

option --autocolor --nop

CDIF

While sdif doesn't care about the contents of each modified lines, it can read the output from cdif command which show the word context differences of each lines. Option --cdif set the appropriate options for cdif. Set --no-cc, --no-mc options at least when invoking cdif manually. Option --no-tc is preferable because text color can be handled by sdif.

From version 4.1.0, option --cdif is set by default, so use --no-cdif option to disable it.

OPTIONS

--width=width, -W width

Use width as a width of output listing. Default width is 80. If the standard error is assigned to a terminal, the width is taken from it if possible.

--[no]number, -n

Print line number on each lines. Default false.

--digit=n

Line number is displayed in 4 digits by default. Use this option to change it.

-i, --ignore-case
-b, --ignore-space-change
-w, --ignore-all-space
-B, --ignore-blank-lines
-c, -Cn, -u, -Un

Passed through to the back-end diff command. Sdif can interpret the output from normal, context (diff -c) and unified diff (diff -u).

--[no]truncate, -t

Truncate lines if they are longer than printing width. Default false.

--[no]onword

Fold long line at word boundaries. Default true.

--[no]cdif[=command]

Use cdif command instead of normal diff command. Enabled by default and use --no-cdif option explicitly to disable it. This option accepts optional parameter as an actual cdif command.

--cdifopts=option

Specify options for back-end cdif command.

--mecab

Pass --mecab option to back-end cdif command. Use --cdifopts to set other options.

--diff=command

Any command can be specified as a diff command to be used. Piping output to sdif is easier unless you want to get whole text.

--diffopts=option

Specify options for back-end diff command.

--mark=position

Specify the position for a mark. Choose from left, right, center, side or no. Default is center.

--column=order

Specify the order of each column by O (old), N (new) and M (merge). Default order is ONM. If you want to show new file on left side and old file in right side, use like:

$ sdif --column NO

Next example show merged file on left-most column for diff3 data.

$ sdif --column MON
--[no]color

Use ANSI color escape sequence for output. Default is true.

--[no]256

Use ANSI 256 color mode. Default is true.

--colortable

Show table of ANSI 216 colors.

--view, -v

Viewer mode. Display two files side-by-side in straightforward order.

--ambiguous=width_spec

This is an experimental option to specify how to treat Unicode ambiguous width characters. Default value is 'narrow'.

detect or auto

Detect from user's locate. Set 'wide' when used in CJK environment.

wide or full

Treat ambiguous characters as wide.

narrow or half

Treat ambiguous characters as narrow.

--colormap=colormap, --cm=colormap

Basic colormap format is :

FIELD=COLOR

where the FIELD is one from these :

OLD       NEW       MERGED    UNCHANGED
--------- --------- --------- ---------
OCOMMAND  NCOMMAND  MCOMMAND           : Command line
OFILE     NFILE     MFILE              : File name
OMARK     NMARK     MMARK     UMARK    : Mark
OLINE     NLINE     MLINE     ULINE    : Line number
OTEXT     NTEXT     MTEXT     UTEXT    : Text

If UMARK and/or ULINE is empty, OMARK/NMARK and/or OLINE/NLINE are used instead.

You can make multiple fields same color joining them by = :

FIELD1=FIELD2=...=COLOR

Also wildcard can be used for field name :

*CHANGE=BDw

Multiple fields can be specified by repeating options

--cm FILED1=COLOR1 --cm FIELD2=COLOR2 ...

or combined with comma (,) :

--cm FILED1=COLOR1,FIELD2=COLOR2, ...

COLOR is a combination of single character representing uppercase foreground color :

R  Red
G  Green
B  Blue
C  Cyan
M  Magenta
Y  Yellow
K  Black
W  White

and alternative (usually brighter) colors in lowercase :

r, g, b, c, m, y, k, w

or RGB values and 24 grey levels if using ANSI 256 or full color terminal :

FORMAT:
    foreground[/background]

COLOR:
    (255,255,255)      : 24bit decimal RGB colors
    #000000 .. #FFFFFF : 24bit hex RGB colors
    #000    .. #FFF    : 12bit hex RGB 4096 colors
    000 .. 555         : 6x6x6 RGB 216 colors
    L00 .. L25         : Black (L00), 24 grey levels, White (L25)

Sample:
    005     0000FF        : blue foreground
       /505       /FF00FF : magenta background
    000/555 000000/FFFFFF : black on white
    500/050 FF0000/00FF00 : red on green

or color names enclosed by angle bracket :

<red> <blue> <green> <cyan> <magenta> <yellow>
<aliceblue> <honeydue> <hotpink> <mooccasin>
<medium_aqua_marine>

and other effects :

Z  0 Zero (reset)
D  1 Double-struck (boldface)
P  2 Pale (dark)
I  3 Italic
U  4 Underline
F  5 Flash (blink: slow)
Q  6 Quick (blink: rapid)
S  7 Stand-out (reverse video)
V  8 Vanish (concealed)
J  9 Junk (crossed out)

E    Erase Line

;    No effect
X    No effect
/    Toggle foreground/background
^    Reset to foreground

At first the color is considered as foreground, and slash (/) switches foreground and background. If multiple colors are given in the same spec, all indicators are produced in the order of their presence. Consequently, the last one takes effect.

If the spec start with plus (+) or minus (-) character, following characters are appneded/deleted from previous value. Reset mark (^) is inserted before appended string.

Effect characters are case insensitive, and can be found anywhere and in any order in color spec string. Because X and ; takes no effect, you can use them to improve readability, like SxD;K/544.

Defaults are :

OCOMMAND => "555/010"  or "GS"
NCOMMAND => "555/010"  or "GS"
MCOMMAND => "555/010"  or "GS"
OFILE    => "555/010D" or "GDS"
NFILE    => "555/010D" or "GDS"
MFILE    => "555/010D" or "GDS"
OMARK    => "010/444"  or "G/W"
NMARK    => "010/444"  or "G/W"
MMARK    => "010/444"  or "G/W"
UMARK    => ""
OLINE    => "220"      or "Y"
NLINE    => "220"      or "Y"
MLINE    => "220"      or "Y"
ULINE    => ""
OTEXT    => "K/454"    or "G"
NTEXT    => "K/454"    or "G"
MTEXT    => "K/454"    or "G"
UTEXT    => ""

This is equivalent to :

sdif --cm '?COMMAND=555/010,?FILE=555/010D' \
     --cm '?MARK=010/444,UMARK=' \
     --cm '?LINE=220,ULINE=' \
     --cm '?TEXT=K/454,UTEXT='

MODULE OPTIONS

default

default      --autocolor
--autocolor  -Mautocolor
--nop        do nothing

-Mcolors

Following options are available by default. Use `perldoc -m App::sdif::colors` to see actual setting.

--light
--green
--cmy
--mono

--dark
--dark-green
--dark-cmy
--dark-mono

ENVIRONMENT

Environment variable SDIFOPTS is used to set default options.

AUTHOR

Kazumasa Utashiro
https://github.com/kaz-utashiro/sdif-tools

LICENSE

Copyright 1992-2019 Kazumasa Utashiro

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

SEE ALSO

cdif(1), watchdiff(1)

Getopt::EX::Colormap

App::sdif::colors, App::sdif::autocolor, App::sdif::autocolor::Apple_Terminal