D7: editor multi-cursor support

Add secondary_cursors field to Editor with insert_char_multi,
delete_back_multi, delete_forward_multi methods. Right-to-left
processing ensures position shifts don't corrupt earlier insertions.

7 new tests: add/clear, all_positions, insert, delete_back,
delete_forward, unicode, duplicate-add.
This commit is contained in:
2026-07-05 22:29:19 +03:00
parent 7a2b0d5160
commit b8aac3c9bc
2226 changed files with 876572 additions and 2382 deletions
@@ -0,0 +1,39 @@
# Automakefile for GNU diffutils man pages
# Copyright (C) 2002, 2009-2013, 2015-2017 Free Software Foundation, Inc.
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
dist_man1_MANS = cmp.1 diff.1 diff3.1 sdiff.1
EXTRA_DIST = $(dist_man1_MANS:%.1=%.x) help2man
MAINTAINERCLEANFILES = $(dist_man1_MANS)
S = $(top_srcdir)/src
cmp.1: $S/cmp.c cmp.x
diff.1: $S/diff.c diff.x
diff3.1: $S/diff3.c diff3.x
sdiff.1: $S/sdiff.c sdiff.x
# Directory in which just-built programs reside. It is used
# to ensure help2man invokes them via the use of PATH below.
bin_dir = ../src
# Depend on the former to get version number changes.
$(dist_man1_MANS): $(SRC_VERSION_C) help2man
$(AM_V_GEN)base=`expr $@ : '\(.*\).1'` \
&& test -x $(bin_dir)/$$base \
&& (echo '[NAME]' && sed 's@/\* *@@; s/-/\\-/; q' $S/$$base.c) \
| PATH="$(bin_dir)$(PATH_SEPARATOR)$$PATH" \
$(srcdir)/help2man -i - -i $(srcdir)/$$base.x \
-S '$(PACKAGE) $(VERSION)' $$base > $@-t && mv $@-t $@
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,74 @@
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.40.4.
.TH CMP "1" "May 2017" "diffutils 3.6" "User Commands"
.SH NAME
cmp \- compare two files byte by byte
.SH SYNOPSIS
.B cmp
[\fIOPTION\fR]... \fIFILE1 \fR[\fIFILE2 \fR[\fISKIP1 \fR[\fISKIP2\fR]]]
.SH DESCRIPTION
Compare two files byte by byte.
.PP
The optional SKIP1 and SKIP2 specify the number of bytes to skip
at the beginning of each file (zero by default).
.PP
Mandatory arguments to long options are mandatory for short options too.
.TP
\fB\-b\fR, \fB\-\-print\-bytes\fR
print differing bytes
.TP
\fB\-i\fR, \fB\-\-ignore\-initial\fR=\fISKIP\fR
skip first SKIP bytes of both inputs
.TP
\fB\-i\fR, \fB\-\-ignore\-initial\fR=\fISKIP1\fR:SKIP2
skip first SKIP1 bytes of FILE1 and
first SKIP2 bytes of FILE2
.TP
\fB\-l\fR, \fB\-\-verbose\fR
output byte numbers and differing byte values
.TP
\fB\-n\fR, \fB\-\-bytes\fR=\fILIMIT\fR
compare at most LIMIT bytes
.TP
\fB\-s\fR, \fB\-\-quiet\fR, \fB\-\-silent\fR
suppress all normal output
.TP
\fB\-\-help\fR
display this help and exit
.TP
\fB\-v\fR, \fB\-\-version\fR
output version information and exit
.PP
SKIP values may be followed by the following multiplicative suffixes:
kB 1000, K 1024, MB 1,000,000, M 1,048,576,
GB 1,000,000,000, G 1,073,741,824, and so on for T, P, E, Z, Y.
.PP
If a FILE is '\-' or missing, read standard input.
Exit status is 0 if inputs are the same, 1 if different, 2 if trouble.
.SH AUTHOR
Written by Torbjorn Granlund and David MacKenzie.
.SH "REPORTING BUGS"
Report bugs to: bug\-diffutils@gnu.org
.br
GNU diffutils home page: <http://www.gnu.org/software/diffutils/>
.br
General help using GNU software: <http://www.gnu.org/gethelp/>
.SH COPYRIGHT
Copyright \(co 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
.br
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
.SH "SEE ALSO"
diff(1), diff3(1), sdiff(1)
.PP
The full documentation for
.B cmp
is maintained as a Texinfo manual. If the
.B info
and
.B cmp
programs are properly installed at your site, the command
.IP
.B info cmp
.PP
should give you access to the complete manual.
@@ -0,0 +1,2 @@
[SEE ALSO]
diff(1), diff3(1), sdiff(1)
@@ -0,0 +1,266 @@
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.40.4.
.TH DIFF "1" "May 2017" "diffutils 3.6" "User Commands"
.SH NAME
diff \- compare files line by line
.SH SYNOPSIS
.B diff
[\fIOPTION\fR]... \fIFILES\fR
.SH DESCRIPTION
Compare FILES line by line.
.PP
Mandatory arguments to long options are mandatory for short options too.
.TP
\fB\-\-normal\fR
output a normal diff (the default)
.TP
\fB\-q\fR, \fB\-\-brief\fR
report only when files differ
.TP
\fB\-s\fR, \fB\-\-report\-identical\-files\fR
report when two files are the same
.TP
\fB\-c\fR, \fB\-C\fR NUM, \fB\-\-context\fR[=\fINUM\fR]
output NUM (default 3) lines of copied context
.TP
\fB\-u\fR, \fB\-U\fR NUM, \fB\-\-unified\fR[=\fINUM\fR]
output NUM (default 3) lines of unified context
.TP
\fB\-e\fR, \fB\-\-ed\fR
output an ed script
.TP
\fB\-n\fR, \fB\-\-rcs\fR
output an RCS format diff
.TP
\fB\-y\fR, \fB\-\-side\-by\-side\fR
output in two columns
.TP
\fB\-W\fR, \fB\-\-width\fR=\fINUM\fR
output at most NUM (default 130) print columns
.TP
\fB\-\-left\-column\fR
output only the left column of common lines
.TP
\fB\-\-suppress\-common\-lines\fR
do not output common lines
.TP
\fB\-p\fR, \fB\-\-show\-c\-function\fR
show which C function each change is in
.TP
\fB\-F\fR, \fB\-\-show\-function\-line\fR=\fIRE\fR
show the most recent line matching RE
.TP
\fB\-\-label\fR LABEL
use LABEL instead of file name and timestamp
(can be repeated)
.TP
\fB\-t\fR, \fB\-\-expand\-tabs\fR
expand tabs to spaces in output
.TP
\fB\-T\fR, \fB\-\-initial\-tab\fR
make tabs line up by prepending a tab
.TP
\fB\-\-tabsize\fR=\fINUM\fR
tab stops every NUM (default 8) print columns
.TP
\fB\-\-suppress\-blank\-empty\fR
suppress space or tab before empty output lines
.TP
\fB\-l\fR, \fB\-\-paginate\fR
pass output through 'pr' to paginate it
.TP
\fB\-r\fR, \fB\-\-recursive\fR
recursively compare any subdirectories found
.TP
\fB\-\-no\-dereference\fR
don't follow symbolic links
.TP
\fB\-N\fR, \fB\-\-new\-file\fR
treat absent files as empty
.TP
\fB\-\-unidirectional\-new\-file\fR
treat absent first files as empty
.TP
\fB\-\-ignore\-file\-name\-case\fR
ignore case when comparing file names
.TP
\fB\-\-no\-ignore\-file\-name\-case\fR
consider case when comparing file names
.TP
\fB\-x\fR, \fB\-\-exclude\fR=\fIPAT\fR
exclude files that match PAT
.TP
\fB\-X\fR, \fB\-\-exclude\-from\fR=\fIFILE\fR
exclude files that match any pattern in FILE
.TP
\fB\-S\fR, \fB\-\-starting\-file\fR=\fIFILE\fR
start with FILE when comparing directories
.TP
\fB\-\-from\-file\fR=\fIFILE1\fR
compare FILE1 to all operands;
FILE1 can be a directory
.TP
\fB\-\-to\-file\fR=\fIFILE2\fR
compare all operands to FILE2;
FILE2 can be a directory
.TP
\fB\-i\fR, \fB\-\-ignore\-case\fR
ignore case differences in file contents
.TP
\fB\-E\fR, \fB\-\-ignore\-tab\-expansion\fR
ignore changes due to tab expansion
.TP
\fB\-Z\fR, \fB\-\-ignore\-trailing\-space\fR
ignore white space at line end
.TP
\fB\-b\fR, \fB\-\-ignore\-space\-change\fR
ignore changes in the amount of white space
.TP
\fB\-w\fR, \fB\-\-ignore\-all\-space\fR
ignore all white space
.TP
\fB\-B\fR, \fB\-\-ignore\-blank\-lines\fR
ignore changes where lines are all blank
.TP
\fB\-I\fR, \fB\-\-ignore\-matching\-lines\fR=\fIRE\fR
ignore changes where all lines match RE
.TP
\fB\-a\fR, \fB\-\-text\fR
treat all files as text
.TP
\fB\-\-strip\-trailing\-cr\fR
strip trailing carriage return on input
.TP
\fB\-D\fR, \fB\-\-ifdef\fR=\fINAME\fR
output merged file with '#ifdef NAME' diffs
.TP
\fB\-\-GTYPE\-group\-format\fR=\fIGFMT\fR
format GTYPE input groups with GFMT
.TP
\fB\-\-line\-format\fR=\fILFMT\fR
format all input lines with LFMT
.TP
\fB\-\-LTYPE\-line\-format\fR=\fILFMT\fR
format LTYPE input lines with LFMT
.IP
These format options provide fine\-grained control over the output
.IP
of diff, generalizing \fB\-D\fR/\-\-ifdef.
.TP
LTYPE is 'old', 'new', or 'unchanged'.
GTYPE is LTYPE or 'changed'.
.IP
GFMT (only) may contain:
.TP
%<
lines from FILE1
.TP
%>
lines from FILE2
.TP
%=
lines common to FILE1 and FILE2
.TP
%[\-][WIDTH][.[PREC]]{doxX}LETTER
printf\-style spec for LETTER
.IP
LETTERs are as follows for new group, lower case for old group:
.TP
F
first line number
.TP
L
last line number
.TP
N
number of lines = L\-F+1
.TP
E
F\-1
.TP
M
L+1
.TP
%(A=B?T:E)
if A equals B then T else E
.IP
LFMT (only) may contain:
.TP
%L
contents of line
.TP
%l
contents of line, excluding any trailing newline
.TP
%[\-][WIDTH][.[PREC]]{doxX}n
printf\-style spec for input line number
.IP
Both GFMT and LFMT may contain:
.TP
%%
%
.TP
%c'C'
the single character C
.TP
%c'\eOOO'
the character with octal code OOO
.TP
C
the character C (other characters represent themselves)
.TP
\fB\-d\fR, \fB\-\-minimal\fR
try hard to find a smaller set of changes
.TP
\fB\-\-horizon\-lines\fR=\fINUM\fR
keep NUM lines of the common prefix and suffix
.TP
\fB\-\-speed\-large\-files\fR
assume large files and many scattered small changes
.TP
\fB\-\-color\fR[=\fIWHEN\fR]
colorize the output; WHEN can be 'never', 'always',
or 'auto' (the default)
.TP
\fB\-\-palette\fR=\fIPALETTE\fR
the colors to use when \fB\-\-color\fR is active; PALETTE is
a colon\-separated list of terminfo capabilities
.TP
\fB\-\-help\fR
display this help and exit
.TP
\fB\-v\fR, \fB\-\-version\fR
output version information and exit
.PP
FILES are 'FILE1 FILE2' or 'DIR1 DIR2' or 'DIR FILE' or 'FILE DIR'.
If \fB\-\-from\-file\fR or \fB\-\-to\-file\fR is given, there are no restrictions on FILE(s).
If a FILE is '\-', read standard input.
Exit status is 0 if inputs are the same, 1 if different, 2 if trouble.
.SH AUTHOR
Written by Paul Eggert, Mike Haertel, David Hayes,
Richard Stallman, and Len Tower.
.SH "REPORTING BUGS"
Report bugs to: bug\-diffutils@gnu.org
.br
GNU diffutils home page: <http://www.gnu.org/software/diffutils/>
.br
General help using GNU software: <http://www.gnu.org/gethelp/>
.SH COPYRIGHT
Copyright \(co 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
.br
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
.SH "SEE ALSO"
wdiff(1), cmp(1), diff3(1), sdiff(1), patch(1)
.PP
The full documentation for
.B diff
is maintained as a Texinfo manual. If the
.B info
and
.B diff
programs are properly installed at your site, the command
.IP
.B info diff
.PP
should give you access to the complete manual.
@@ -0,0 +1,2 @@
[SEE ALSO]
wdiff(1), cmp(1), diff3(1), sdiff(1), patch(1)
@@ -0,0 +1,100 @@
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.40.4.
.TH DIFF3 "1" "May 2017" "diffutils 3.6" "User Commands"
.SH NAME
diff3 \- compare three files line by line
.SH SYNOPSIS
.B diff3
[\fIOPTION\fR]... \fIMYFILE OLDFILE YOURFILE\fR
.SH DESCRIPTION
Compare three files line by line.
.PP
Mandatory arguments to long options are mandatory for short options too.
.TP
\fB\-A\fR, \fB\-\-show\-all\fR
output all changes, bracketing conflicts
.TP
\fB\-e\fR, \fB\-\-ed\fR
output ed script incorporating changes
from OLDFILE to YOURFILE into MYFILE
.TP
\fB\-E\fR, \fB\-\-show\-overlap\fR
like \fB\-e\fR, but bracket conflicts
.TP
\fB\-3\fR, \fB\-\-easy\-only\fR
like \fB\-e\fR, but incorporate only nonoverlapping changes
.TP
\fB\-x\fR, \fB\-\-overlap\-only\fR
like \fB\-e\fR, but incorporate only overlapping changes
.TP
\fB\-X\fR
like \fB\-x\fR, but bracket conflicts
.TP
\fB\-i\fR
append 'w' and 'q' commands to ed scripts
.TP
\fB\-m\fR, \fB\-\-merge\fR
output actual merged file, according to
\fB\-A\fR if no other options are given
.TP
\fB\-a\fR, \fB\-\-text\fR
treat all files as text
.TP
\fB\-\-strip\-trailing\-cr\fR
strip trailing carriage return on input
.TP
\fB\-T\fR, \fB\-\-initial\-tab\fR
make tabs line up by prepending a tab
.TP
\fB\-\-diff\-program\fR=\fIPROGRAM\fR
use PROGRAM to compare files
.TP
\fB\-L\fR, \fB\-\-label\fR=\fILABEL\fR
use LABEL instead of file name
(can be repeated up to three times)
.TP
\fB\-\-help\fR
display this help and exit
.TP
\fB\-v\fR, \fB\-\-version\fR
output version information and exit
.PP
The default output format is a somewhat human\-readable representation of
the changes.
.PP
The \fB\-e\fR, \fB\-E\fR, \fB\-x\fR, \fB\-X\fR (and corresponding long) options cause an ed script
to be output instead of the default.
.PP
Finally, the \fB\-m\fR (\fB\-\-merge\fR) option causes diff3 to do the merge internally
and output the actual merged file. For unusual input, this is more
robust than using ed.
.PP
If a FILE is '\-', read standard input.
Exit status is 0 if successful, 1 if conflicts, 2 if trouble.
.SH AUTHOR
Written by Randy Smith.
.SH "REPORTING BUGS"
Report bugs to: bug\-diffutils@gnu.org
.br
GNU diffutils home page: <http://www.gnu.org/software/diffutils/>
.br
General help using GNU software: <http://www.gnu.org/gethelp/>
.SH COPYRIGHT
Copyright \(co 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
.br
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
.SH "SEE ALSO"
cmp(1), diff(1), sdiff(1)
.PP
The full documentation for
.B diff3
is maintained as a Texinfo manual. If the
.B info
and
.B diff3
programs are properly installed at your site, the command
.IP
.B info diff3
.PP
should give you access to the complete manual.
@@ -0,0 +1,2 @@
[SEE ALSO]
cmp(1), diff(1), sdiff(1)
+671
View File
@@ -0,0 +1,671 @@
#!/usr/bin/perl -w
# Generate a short man page from --help and --version output.
# Copyright (C) 1997-2005, 2009-2011, 2013, 2015-2017 Free Software Foundation,
# Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3, or (at your option)
# any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
# Written by Brendan O'Dea <bod@debian.org>
# Available from ftp://ftp.gnu.org/gnu/help2man/
use 5.008;
use strict;
use Getopt::Long;
use Text::Tabs qw(expand);
use POSIX qw(strftime setlocale LC_ALL);
my $this_program = 'help2man';
my $this_version = '1.40.4';
sub _ { $_[0] }
sub configure_locale
{
my $locale = shift;
die "$this_program: no locale support (Locale::gettext required)\n"
unless $locale eq 'C';
}
sub dec { $_[0] }
sub enc { $_[0] }
sub enc_user { $_[0] }
sub kark { die +(sprintf shift, @_), "\n" }
sub N_ { $_[0] }
my $version_info = enc_user sprintf _(<<'EOT'), $this_program, $this_version;
GNU %s %s
Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2009, 2010,
2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Brendan O'Dea <bod@debian.org>
EOT
my $help_info = enc_user sprintf _(<<'EOT'), $this_program, $this_program;
'%s' generates a man page out of '--help' and '--version' output.
Usage: %s [OPTION]... EXECUTABLE
-n, --name=STRING description for the NAME paragraph
-s, --section=SECTION section number for manual page (1, 6, 8)
-m, --manual=TEXT name of manual (User Commands, ...)
-S, --source=TEXT source of program (FSF, Debian, ...)
-L, --locale=STRING select locale (default "C")
-i, --include=FILE include material from 'FILE'
-I, --opt-include=FILE include material from 'FILE' if it exists
-o, --output=FILE send output to 'FILE'
-p, --info-page=TEXT name of Texinfo manual
-N, --no-info suppress pointer to Texinfo manual
-l, --libtool exclude the 'lt-' from the program name
--help print this help, then exit
--version print version number, then exit
EXECUTABLE should accept '--help' and '--version' options and produce output on
stdout although alternatives may be specified using:
-h, --help-option=STRING help option string
-v, --version-option=STRING version option string
--version-string=STRING version string
--no-discard-stderr include stderr when parsing option output
Report bugs to <bug-help2man@gnu.org>.
EOT
my $section = 1;
my $manual = '';
my $source = '';
my $help_option = '--help';
my $version_option = '--version';
my $discard_stderr = 1;
my ($opt_name, @opt_include, $opt_output, $opt_info, $opt_no_info, $opt_libtool,
$version_text);
my %opt_def = (
'n|name=s' => \$opt_name,
's|section=s' => \$section,
'm|manual=s' => \$manual,
'S|source=s' => \$source,
'L|locale=s' => sub { configure_locale pop },
'i|include=s' => sub { push @opt_include, [ pop, 1 ] },
'I|opt-include=s' => sub { push @opt_include, [ pop, 0 ] },
'o|output=s' => \$opt_output,
'p|info-page=s' => \$opt_info,
'N|no-info' => \$opt_no_info,
'l|libtool' => \$opt_libtool,
'help' => sub { print $help_info; exit },
'version' => sub { print $version_info; exit },
'h|help-option=s' => \$help_option,
'v|version-option=s' => \$version_option,
'version-string=s' => \$version_text,
'discard-stderr!' => \$discard_stderr,
);
# Parse options.
Getopt::Long::config('bundling');
die $help_info unless GetOptions %opt_def and @ARGV == 1;
my %include = ();
my %append = ();
my @include = (); # retain order given in include file
# Process include file (if given). Format is:
#
# [section name]
# verbatim text
#
# or
#
# /pattern/
# verbatim text
#
while (@opt_include)
{
my ($inc, $required) = @{shift @opt_include};
next unless -f $inc or $required;
kark N_("%s: can't open '%s' (%s)"), $this_program, $inc, $!
unless open INC, $inc;
my $key;
my $hash = \%include;
while (<INC>)
{
# Convert input to internal Perl format, so that multibyte
# sequences are treated as single characters.
$_ = dec $_;
# [section]
if (/^\[([^]]+)\]\s*$/)
{
$key = uc $1;
$key =~ s/^\s+//;
$key =~ s/\s+$//;
$hash = \%include;
push @include, $key unless $include{$key};
next;
}
# /pattern/
if (m!^/(.*)/([ims]*)\s*$!)
{
my $pat = $2 ? "(?$2)$1" : $1;
# Check pattern.
eval { $key = qr($pat) };
if ($@)
{
$@ =~ s/ at .*? line \d.*//;
die "$inc:$.:$@";
}
$hash = \%append;
next;
}
# Check for options before the first section--anything else is
# silently ignored, allowing the first for comments and
# revision info.
unless ($key)
{
# handle options
if (/^-/)
{
local @ARGV = split;
GetOptions %opt_def;
}
next;
}
$hash->{$key} ||= '';
$hash->{$key} .= $_;
}
close INC;
kark N_("%s: no valid information found in '%s'"), $this_program, $inc
unless $key;
}
# Compress trailing blank lines.
for my $hash (\(%include, %append))
{
for (keys %$hash) { $hash->{$_} =~ s/\n+$/\n/ }
}
sub get_option_value;
# Grab help and version info from executable.
my $help_text = get_option_value $ARGV[0], $help_option;
$version_text ||= get_option_value $ARGV[0], $version_option;
# Translators: the following message is a strftime(3) format string, which in
# the English version expands to the month as a word and the full year. It
# is used on the footer of the generated manual pages. If in doubt, you may
# just use %x as the value (which should be the full locale-specific date).
my $date = enc strftime _("%B %Y"), localtime;
(my $program = $ARGV[0]) =~ s!.*/!!;
my $package = $program;
my $version;
if ($opt_output)
{
unlink $opt_output or kark N_("%s: can't unlink %s (%s)"),
$this_program, $opt_output, $! if -e $opt_output;
open STDOUT, ">$opt_output"
or kark N_("%s: can't create %s (%s)"), $this_program, $opt_output, $!;
}
# The first line of the --version information is assumed to be in one
# of the following formats:
#
# <version>
# <program> <version>
# {GNU,Free} <program> <version>
# <program> ({GNU,Free} <package>) <version>
# <program> - {GNU,Free} <package> <version>
#
# and separated from any copyright/author details by a blank line.
($_, $version_text) = ((split /\n+/, $version_text, 2), '');
if (/^(\S+) +\(((?:GNU|Free) +[^)]+)\) +(.*)/ or
/^(\S+) +- *((?:GNU|Free) +\S+) +(.*)/)
{
$program = $1;
$package = $2;
$version = $3;
}
elsif (/^((?:GNU|Free) +)?(\S+) +(.*)/)
{
$program = $2;
$package = $1 ? "$1$2" : $2;
$version = $3;
}
else
{
$version = $_;
}
$program =~ s!.*/!!;
# No info for 'info' itself.
$opt_no_info = 1 if $program eq 'info';
# Translators: "NAME", "SYNOPSIS" and other one or two word strings in all
# upper case are manual page section headings. The man(1) manual page in your
# language, if available should provide the conventional translations.
for ($include{_('NAME')})
{
if ($opt_name) # --name overrides --include contents.
{
$_ = "$program \\- $opt_name\n";
}
elsif ($_) # Use first name given as $program
{
$program = $1 if /^([^\s,]+)(?:,?\s*[^\s,\\-]+)*\s+\\?-/;
}
else # Set a default (useless) NAME paragraph.
{
$_ = sprintf _("%s \\- manual page for %s %s") . "\n", $program,
$program, $version;
}
}
# Man pages traditionally have the page title in caps.
my $PROGRAM = uc $program;
# Set default page head/footers
$source ||= "$program $version";
unless ($manual)
{
for ($section)
{
if (/^(1[Mm]|8)/) { $manual = enc _('System Administration Utilities') }
elsif (/^6/) { $manual = enc _('Games') }
else { $manual = enc _('User Commands') }
}
}
# Extract usage clause(s) [if any] for SYNOPSIS.
# Translators: "Usage" and "or" here are patterns (regular expressions) which
# are used to match the usage synopsis in program output. An example from cp
# (GNU coreutils) which contains both strings:
# Usage: cp [OPTION]... [-T] SOURCE DEST
# or: cp [OPTION]... SOURCE... DIRECTORY
# or: cp [OPTION]... -t DIRECTORY SOURCE...
my $PAT_USAGE = _('Usage');
my $PAT_USAGE_CONT = _('or');
if ($help_text =~ s/^($PAT_USAGE):( +(\S+))(.*)((?:\n(?: {6}\1| *($PAT_USAGE_CONT): +\S).*)*)//om)
{
my @syn = $3 . $4;
if ($_ = $5)
{
s/^\n//;
for (split /\n/) { s/^ *(($PAT_USAGE_CONT): +)?//o; push @syn, $_ }
}
my $synopsis = '';
for (@syn)
{
$synopsis .= ".br\n" if $synopsis;
s!^\S*/!!;
s/^lt-// if $opt_libtool;
s/^(\S+) *//;
$synopsis .= ".B $1\n";
s/\s+$//;
s/(([][]|\.\.+)+)/\\fR$1\\fI/g;
s/^/\\fI/ unless s/^\\fR//;
$_ .= '\fR';
s/(\\fI)( *)/$2$1/g;
s/\\fI\\fR//g;
s/^\\fR//;
s/\\fI$//;
s/^\./\\&./;
$synopsis .= "$_\n";
}
$include{_('SYNOPSIS')} ||= $synopsis;
}
# Process text, initial section is DESCRIPTION.
my $sect = _('DESCRIPTION');
$_ = "$help_text\n\n$version_text";
# Normalise paragraph breaks.
s/^\n+//;
s/\n*$/\n/;
s/\n\n+/\n\n/g;
# Join hyphenated lines.
s/([A-Za-z])-\n *([A-Za-z])/$1$2/g;
# Temporarily exchange leading dots, apostrophes and backslashes for
# tokens.
s/^\./\x80/mg;
s/^'/\x81/mg;
s/\\/\x82/g;
# Translators: patterns are used to match common program output. In the source
# these strings are all of the form of "my $PAT_something = _('...');" and are
# regular expressions. If there is more than one commonly used string, you
# may separate alternatives with "|". Spaces in these expressions are written
# as " +" to indicate that more than one space may be matched. The string
# "(?:[\\w-]+ +)?" in the bug reporting pattern is used to indicate an
# optional word, so that either "Report bugs" or "Report _program_ bugs" will
# be matched.
my $PAT_BUGS = _('Report +(?:[\w-]+ +)?bugs|Email +bug +reports +to');
my $PAT_AUTHOR = _('Written +by');
my $PAT_OPTIONS = _('Options');
my $PAT_ENVIRONMENT = _('Environment');
my $PAT_FILES = _('Files');
my $PAT_EXAMPLES = _('Examples');
my $PAT_FREE_SOFTWARE = _('This +is +free +software');
# Start a new paragraph (if required) for these.
s/([^\n])\n($PAT_BUGS|$PAT_AUTHOR) /$1\n\n$2 /og;
# Convert iso-8859-1 copyright symbol or (c) to nroff
# character.
s/^Copyright +(?:\xa9|\([Cc]\))/Copyright \\(co/mg;
sub convert_option;
while (length)
{
# Convert some standard paragraph names.
if (s/^($PAT_OPTIONS): *\n//o)
{
$sect = _('OPTIONS');
next;
}
if (s/^($PAT_ENVIRONMENT): *\n//o)
{
$sect = _('ENVIRONMENT');
next;
}
if (s/^($PAT_FILES): *\n//o)
{
$sect = _('FILES');
next;
}
elsif (s/^($PAT_EXAMPLES): *\n//o)
{
$sect = _('EXAMPLES');
next;
}
# Copyright section
if (/^Copyright /)
{
$sect = _('COPYRIGHT');
}
# Bug reporting section.
elsif (/^($PAT_BUGS) /o)
{
$sect = _('REPORTING BUGS');
}
# Author section.
elsif (/^($PAT_AUTHOR)/o)
{
$sect = _('AUTHOR');
}
# Examples, indicated by an indented leading $, % or > are
# rendered in a constant width font.
if (/^( +)([\$\%>] )\S/)
{
my $indent = $1;
my $prefix = $2;
my $break = '.IP';
$include{$sect} ||= '';
while (s/^$indent\Q$prefix\E(\S.*)\n*//)
{
$include{$sect} .= "$break\n\\f(CW$prefix$1\\fR\n";
$break = '.br';
}
next;
}
my $matched = '';
$include{$sect} ||= '';
# Sub-sections have a trailing colon and the second line indented.
if (s/^(\S.*:) *\n / /)
{
$matched .= $& if %append;
$include{$sect} .= qq(.SS "$1"\n);
}
my $indent = 0;
my $content = '';
# Option with description.
if (s/^( {1,10}([+-]\S.*?))(?:( +(?!-))|\n( {20,}))(\S.*)\n//)
{
$matched .= $& if %append;
$indent = length ($4 || "$1$3");
$content = ".TP\n\x84$2\n\x84$5\n";
unless ($4)
{
# Indent may be different on second line.
$indent = length $& if /^ {20,}/;
}
}
# Option without description.
elsif (s/^ {1,10}([+-]\S.*)\n//)
{
$matched .= $& if %append;
$content = ".HP\n\x84$1\n";
$indent = 80; # not continued
}
# Indented paragraph with tag.
elsif (s/^( +(\S.*?) +)(\S.*)\n//)
{
$matched .= $& if %append;
$indent = length $1;
$content = ".TP\n\x84$2\n\x84$3\n";
}
# Indented paragraph.
elsif (s/^( +)(\S.*)\n//)
{
$matched .= $& if %append;
$indent = length $1;
$content = ".IP\n\x84$2\n";
}
# Left justified paragraph.
else
{
s/(.*)\n//;
$matched .= $& if %append;
$content = ".PP\n" if $include{$sect};
$content .= "$1\n";
}
# Append continuations.
while ($indent ? s/^ {$indent}(\S.*)\n// : s/^(\S.*)\n//)
{
$matched .= $& if %append;
$content .= "\x84$1\n";
}
# Move to next paragraph.
s/^\n+//;
for ($content)
{
# Leading dot and apostrophe protection.
s/\x84\./\x80/g;
s/\x84'/\x81/g;
s/\x84//g;
# Convert options.
s/(^| |\()(-[][\w=-]+)/$1 . convert_option $2/mge;
# Escape remaining hyphens
s/-/\x83/g;
if ($sect eq 'COPYRIGHT')
{
# Insert line breaks before additional copyright messages
# and the disclaimer.
s/\n(Copyright |$PAT_FREE_SOFTWARE)/\n.br\n$1/og;
}
elsif ($sect eq 'REPORTING BUGS')
{
# Handle multi-line bug reporting sections of the form:
#
# Report <program> bugs to <addr>
# GNU <package> home page: <url>
# ...
s/\n([[:upper:]])/\n.br\n$1/g;
}
}
# Check if matched paragraph contains /pat/.
if (%append)
{
for my $pat (keys %append)
{
if ($matched =~ $pat)
{
$content .= ".PP\n" unless $append{$pat} =~ /^\./;
$content .= $append{$pat};
}
}
}
$include{$sect} .= $content;
}
# Refer to the real documentation.
unless ($opt_no_info)
{
my $info_page = $opt_info || $program;
$sect = _('SEE ALSO');
$include{$sect} ||= '';
$include{$sect} .= ".PP\n" if $include{$sect};
$include{$sect} .= sprintf _(<<'EOT'), $program, $program, $info_page;
The full documentation for
.B %s
is maintained as a Texinfo manual. If the
.B info
and
.B %s
programs are properly installed at your site, the command
.IP
.B info %s
.PP
should give you access to the complete manual.
EOT
}
# Output header.
print <<EOT;
.\\" DO NOT MODIFY THIS FILE! It was generated by $this_program $this_version.
.TH $PROGRAM "$section" "$date" "$source" "$manual"
EOT
# Section ordering.
my @pre = (_('NAME'), _('SYNOPSIS'), _('DESCRIPTION'), _('OPTIONS'),
_('ENVIRONMENT'), _('FILES'), _('EXAMPLES'));
my @post = (_('AUTHOR'), _('REPORTING BUGS'), _('COPYRIGHT'), _('SEE ALSO'));
my $filter = join '|', @pre, @post;
# Output content.
for my $sect (@pre, (grep ! /^($filter)$/o, @include), @post)
{
if ($include{$sect})
{
my $quote = $sect =~ /\W/ ? '"' : '';
print enc ".SH $quote$sect$quote\n";
for ($include{$sect})
{
# Replace leading dot, apostrophe, backslash and hyphen
# tokens.
s/\x80/\\&./g;
s/\x81/\\&'/g;
s/\x82/\\e/g;
s/\x83/\\-/g;
# Convert some latin1 chars to troff equivalents
s/\xa0/\\ /g; # non-breaking space
print enc $_;
}
}
}
close STDOUT or kark N_("%s: error writing to %s (%s)"), $this_program,
$opt_output || 'stdout', $!;
exit;
# Call program with given option and return results.
sub get_option_value
{
my ($prog, $opt) = @_;
my $stderr = $discard_stderr ? '/dev/null' : '&1';
my $value = join '',
map { s/ +$//; expand $_ }
map { dec $_ }
`$prog $opt 2>$stderr`;
unless ($value)
{
my $err = N_("%s: can't get '%s' info from %s%s");
my $extra = $discard_stderr
? "\n" . N_("Try '--no-discard-stderr' if option outputs to stderr")
: '';
kark $err, $this_program, $opt, $prog, $extra;
}
return $value;
}
# Convert option dashes to \- to stop nroff from hyphenating 'em, and
# embolden. Option arguments get italicised.
sub convert_option
{
local $_ = '\fB' . shift;
s/-/\x83/g;
unless (s/\[=(.*)\]$/\\fR[=\\fI$1\\fR]/)
{
s/=(.)/\\fR=\\fI$1/;
s/ (.)/ \\fI$1/;
$_ .= '\fR';
}
$_;
}
@@ -0,0 +1,102 @@
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.40.4.
.TH SDIFF "1" "May 2017" "diffutils 3.6" "User Commands"
.SH NAME
sdiff \- side-by-side merge of file differences
.SH SYNOPSIS
.B sdiff
[\fIOPTION\fR]... \fIFILE1 FILE2\fR
.SH DESCRIPTION
Side\-by\-side merge of differences between FILE1 and FILE2.
.PP
Mandatory arguments to long options are mandatory for short options too.
.TP
\fB\-o\fR, \fB\-\-output\fR=\fIFILE\fR
operate interactively, sending output to FILE
.TP
\fB\-i\fR, \fB\-\-ignore\-case\fR
consider upper\- and lower\-case to be the same
.TP
\fB\-E\fR, \fB\-\-ignore\-tab\-expansion\fR
ignore changes due to tab expansion
.TP
\fB\-Z\fR, \fB\-\-ignore\-trailing\-space\fR
ignore white space at line end
.TP
\fB\-b\fR, \fB\-\-ignore\-space\-change\fR
ignore changes in the amount of white space
.TP
\fB\-W\fR, \fB\-\-ignore\-all\-space\fR
ignore all white space
.TP
\fB\-B\fR, \fB\-\-ignore\-blank\-lines\fR
ignore changes whose lines are all blank
.TP
\fB\-I\fR, \fB\-\-ignore\-matching\-lines\fR=\fIRE\fR
ignore changes all whose lines match RE
.TP
\fB\-\-strip\-trailing\-cr\fR
strip trailing carriage return on input
.TP
\fB\-a\fR, \fB\-\-text\fR
treat all files as text
.TP
\fB\-w\fR, \fB\-\-width\fR=\fINUM\fR
output at most NUM (default 130) print columns
.TP
\fB\-l\fR, \fB\-\-left\-column\fR
output only the left column of common lines
.TP
\fB\-s\fR, \fB\-\-suppress\-common\-lines\fR
do not output common lines
.TP
\fB\-t\fR, \fB\-\-expand\-tabs\fR
expand tabs to spaces in output
.TP
\fB\-\-tabsize\fR=\fINUM\fR
tab stops at every NUM (default 8) print columns
.TP
\fB\-d\fR, \fB\-\-minimal\fR
try hard to find a smaller set of changes
.TP
\fB\-H\fR, \fB\-\-speed\-large\-files\fR
assume large files, many scattered small changes
.TP
\fB\-\-diff\-program\fR=\fIPROGRAM\fR
use PROGRAM to compare files
.TP
\fB\-\-help\fR
display this help and exit
.TP
\fB\-v\fR, \fB\-\-version\fR
output version information and exit
.PP
If a FILE is '\-', read standard input.
Exit status is 0 if inputs are the same, 1 if different, 2 if trouble.
.SH AUTHOR
Written by Thomas Lord.
.SH "REPORTING BUGS"
Report bugs to: bug\-diffutils@gnu.org
.br
GNU diffutils home page: <http://www.gnu.org/software/diffutils/>
.br
General help using GNU software: <http://www.gnu.org/gethelp/>
.SH COPYRIGHT
Copyright \(co 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
.br
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
.SH "SEE ALSO"
cmp(1), diff(1), diff3(1)
.PP
The full documentation for
.B sdiff
is maintained as a Texinfo manual. If the
.B info
and
.B sdiff
programs are properly installed at your site, the command
.IP
.B info sdiff
.PP
should give you access to the complete manual.
@@ -0,0 +1,2 @@
[SEE ALSO]
cmp(1), diff(1), diff3(1)