Compare commits

..

62 Commits

Author SHA1 Message Date
Dima Kogan
744239b7b7 version bump 2018-08-24 13:16:40 -07:00
Dima Kogan
0c06f72d5d Merge branch 'master' into debian 2018-08-24 13:15:05 -07:00
Dima Kogan
350b2db022 version bump 2018-08-24 13:13:45 -07:00
Dima Kogan
ba0f2eee08 completion knows about the fnormal distribution 2018-08-24 13:13:45 -07:00
Dima Kogan
778825bd34 completion knows about the fnormal distribution 2018-08-24 13:11:57 -07:00
Dima Kogan
9237811ed0 Script waits for the plot window to close before exiting
Instead of sleeping forever. This is really nice! I no longer need to quit the
plot window AND then C-c. Quitting the plot window is now sufficient
2018-08-23 22:31:14 -07:00
Dima Kogan
69285d7df1 fixed typo in docs 2018-07-09 18:38:56 -07:00
Dima Kogan
e514b24e39 changelog update 2018-06-17 22:18:41 -07:00
Dima Kogan
88eeff7890 updated URLs to point to salsa 2018-04-19 08:12:29 -07:00
Dima Kogan
aedbc28afe by default --image sets range noextend
This is usually what I want
2018-04-10 00:51:30 -07:00
Dima Kogan
e167e057d3 changelog bump 2018-03-16 13:56:32 -07:00
Dima Kogan
38e92c5ba9 Merge branch 'master' into debian 2018-03-16 13:55:16 -07:00
Dima Kogan
e865871492 changelog bump 2018-03-16 13:53:57 -07:00
Dima Kogan
0f85110a38 --vnl now works with plots that have rangesize > 1 2018-03-16 13:50:49 -07:00
Dima Kogan
811d0d45ab new bash-completion install dir 2018-03-11 18:32:31 -07:00
Dima Kogan
5cf4acca62 zsh completion: --xlen argument isn't optional 2018-03-02 18:02:10 -08:00
Dima Kogan
83d4e66ea5 version bump 2018-02-24 12:57:03 -08:00
Dima Kogan
c2c327953d Merge branch 'master' into debian 2018-02-24 12:55:45 -08:00
Dima Kogan
319e86b667 version bump 2018-02-24 12:34:18 -08:00
Dima Kogan
938e360e84 --vnlog now works with --domain. For real this time 2018-02-23 14:59:40 -08:00
Dima Kogan
d5e8906946 --vnlog now works with --domain 2018-02-23 12:39:49 -08:00
Dima Kogan
e8f9e09090 version bump 2018-02-23 10:21:29 -08:00
Dima Kogan
9df57fb65f fixed typo 2018-02-23 10:20:44 -08:00
Dima Kogan
69bd05eddb version bump 2018-02-22 23:38:10 -08:00
Dima Kogan
ca61de7441 Vnlog integration 2018-02-22 23:35:59 -08:00
Dima Kogan
851eb46aa8 Initial implementation of --vnlog. Undocumented 2018-02-22 12:37:46 -08:00
Dima Kogan
f2ac9c91b8 slightly better documentation plot 2018-02-02 12:22:32 -08:00
Dima Kogan
e79659a10d minor documentation updates 2017-12-23 00:07:21 -08:00
Dima Kogan
2aa51d2a60 Added --tuplesize and --tuplesizeall
These are just convenience options that are VERY similar to --rangesize and
--rangesizeall. But adding these makes this tool nicely similar to gnuplotlib
2017-12-22 23:56:07 -08:00
Dima Kogan
3bf2fa43ef Un-documented --extraValuesPerPoint
This is awkward and I want to get rid of it. It still works, but there's no more documentation for it
2017-12-22 23:30:25 -08:00
Dima Kogan
965570cf70 version bump 2017-10-29 14:06:35 -07:00
Dima Kogan
ebc818791c Merge tag 'v1.45' into debian 2017-10-29 14:06:04 -07:00
Dima Kogan
9cc67cdaeb new release 2017-10-29 14:02:46 -07:00
Dima Kogan
07a109b09a zsh completion: --hardcopy suggests filenames too
Generally --hardcopy should produce new files, but the completion is still
useful.
2017-10-11 18:42:17 -07:00
Dima Kogan
7b3040ecc9 --image now produces a nicer legend: just the filename 2017-10-11 18:32:31 -07:00
Dima Kogan
b59137c255 zsh completions: --image suggests files, --hardcopy does NOT suggest files
--image reads existing files, so it should ask for existing files

--hardcopy creates new files, so it shouldn't suggest existing files
2017-09-30 23:16:41 -07:00
Dima Kogan
fec440c8b3 --curvestyle now overrides --curvestyleall
This is how it was supposed to work, but apparently it didn't work this way:
--curvestyleall options were active for ALL the curves
2017-09-30 22:53:43 -07:00
Dima Kogan
5758865246 custom settings are now set AFTER all our internal ones
Thus the custom settings take precedence
2017-09-30 19:16:54 -07:00
Dima Kogan
6f091d1cf2 The version is now treated as a string not as a number
Before this a version 1.40 was seen as 1.4
2017-09-30 11:02:37 -07:00
Dima Kogan
1c853a2193 zsh now completes filenames 2017-06-27 18:27:26 -07:00
Dima Kogan
f6c1e943ab version bump 2017-06-20 16:46:02 -07:00
Dima Kogan
b8b448e256 Merge branch 'master' into debian 2017-06-20 16:45:23 -07:00
Dima Kogan
defcf5ef59 changelog bump, release 2017-06-20 16:44:55 -07:00
Dima Kogan
ba112a3bd9 --image always goes on the FRONT of the equation list
The image is intended to be background, so I want it to be rendered first, with
everything else on top of it
2017-06-20 16:44:02 -07:00
Dima Kogan
a32370c514 changelog bump 2017-06-19 13:16:32 -07:00
Dima Kogan
5298072894 Merge tag 'v1.43' into debian 2017-06-19 13:16:06 -07:00
Dima Kogan
7d7511e62e changelog update 2017-06-19 13:14:20 -07:00
Dima Kogan
1744aeb6d2 tab completion for --image 2017-06-19 13:11:42 -07:00
Dima Kogan
53f6cdae5b added --image as a convenience wrapper for --equation 2017-06-19 13:08:33 -07:00
Dima Kogan
f21797a89e changelog bump 2017-04-25 11:03:24 -07:00
Dima Kogan
7c704dc251 Merge branch 'master' into debian 2017-04-25 11:02:00 -07:00
Dima Kogan
ed9512924d version bump 2017-03-31 15:40:39 -07:00
Dima Kogan
2ee401fcb4 changelog update 2017-03-31 15:39:48 -07:00
Dima Kogan
7c1f02ec7f reworded manpage of --exit 2017-03-19 19:50:45 -07:00
Dima Kogan
5740e55a6f Data can now come from STDIN or files on the cmdline
This emulates the while(<>) syntax in perl, and makes self-plotting data files
work again. These have been broken since that syntax was taken away in
4cfcf0fc35
2017-03-19 19:50:34 -07:00
Dima Kogan
6f4816efd5 version bump 2017-02-24 23:53:35 -08:00
Dima Kogan
008dc01d17 Merge branch 'master' into debian 2017-02-24 23:51:34 -08:00
Dima Kogan
a0c9e6e8bc version bump 2017-02-24 23:44:20 -08:00
Dima Kogan
64b12e4738 When plotting histograms, --xlen can coexist with --xmin/--xmax 2017-02-09 19:12:18 -08:00
Dima Kogan
402fa32bda histograms work as expected with --xlen and --monotonic 2017-02-09 16:07:12 -08:00
Dima Kogan
7da37a0015 better sanity checking for histogram options 2017-02-09 14:16:58 -08:00
Dima Kogan
a48b834512 getRangeSize() function added to ocnsolidate that logic 2017-02-09 14:16:58 -08:00
8 changed files with 611 additions and 155 deletions

76
Changes
View File

@@ -1,3 +1,79 @@
feedgnuplot (1.50)
* Script waits for the plot window to close before exiting
Instead of sleeping forever. This is really nice! I no longer need
to quit the plot window AND then C-c. Quitting the plot window is
now sufficient
* by default --image sets range noextend
* tab-completion knows about the fnormal distribution
-- Dima Kogan <dkogan@debian.org> Fri, 24 Aug 2018 13:11:05 -0700
feedgnuplot (1.49)
* --vnl now works with plots that have rangesize > 1
* zsh completion: --xlen argument isn't optional
-- Dima Kogan <dima@secretsauce.net> Fri, 16 Mar 2018 13:52:28 -0700
feedgnuplot (1.48)
* --vnlog works properly with --domain
-- Dima Kogan <dima@secretsauce.net> Sat, 24 Feb 2018 12:33:50 -0800
feedgnuplot (1.47)
* Fixed typo. Everything is un-broken now
-- Dima Kogan <dima@secretsauce.net> Fri, 23 Feb 2018 10:21:13 -0800
feedgnuplot (1.46)
* Added --tuplesize and --tuplesizeall as alternatives to --rangesize
and --rangesizeall. Both forms are supported.
* Vnlog integration
-- Dima Kogan <dima@secretsauce.net> Thu, 22 Feb 2018 23:37:54 -0800
feedgnuplot (1.45)
* zsh completion: --hardcopy, --image suggest filenames
* --image now produces a nicer legend: just the filename
* --curvestyle now overrides --curvestyleall
- This is a bug fix
* The version is now treated as a string not as a number
- So "1.40" is distinct from "1.4"
-- Dima Kogan <dima@secretsauce.net> Sun, 29 Oct 2017 13:56:28 -0700
feedgnuplot (1.44)
* --image draws its output beneath everything else
-- Dima Kogan <dima@secretsauce.net> Tue, 20 Jun 2017 16:44:30 -0700
feedgnuplot (1.43)
* Added --image
-- Dima Kogan <dima@secretsauce.net> Mon, 19 Jun 2017 13:12:38 -0700
feedgnuplot (1.42)
* Data can now come from STDIN or files on the cmdline.
This fixes a regression. Self-plotting data files work again
-- Dima Kogan <dima@secretsauce.net> Fri, 31 Mar 2017 15:38:47 -0700
feedgnuplot (1.41)
* Histograms: --xlen can coexist with --xmin/--xmax
* Histograms: work as expected with --xlen and --monotonic
* Histograms: better sanity checking of options
-- Dima Kogan <dima@secretsauce.net> Fri, 24 Feb 2017 23:42:28 -0800
feedgnuplot (1.40)
* If the options couldn't be parsed I don't dump the whole manpage

View File

@@ -20,9 +20,9 @@ sub parseversion
while(<PL>)
{
if( /VERSION = ([0-9\.]+)/ )
if( /VERSION = '([0-9\.]+)'/ )
{
if ( $1 != $version )
if ( $1 ne $version )
{
die "Version mismatch. Changes says version is '$version', but 'bin/feedgnuplot' says it is '$1'";
}

View File

@@ -15,7 +15,8 @@ use Text::ParseWords; # for shellwords
use Pod::Usage;
use Time::Piece;
my $VERSION = 1.40;
# Makefile.PL assumes this is in ''
my $VERSION = '1.50';
my %options;
interpretCommandline();
@@ -41,22 +42,26 @@ my $last_replot_time = [gettimeofday];
# whether the previous replot was timer based
my $last_replot_is_from_timer = 1;
my $prev_timed_replot_time = [gettimeofday];
my $this_replot_is_from_timer;
my $stdin = IO::Handle->new();
die "Couldn't open STDIN" unless $stdin->fdopen(fileno(STDIN),"r");
my $selector = IO::Select->new( $stdin );
mainThread();
sub getRangeSize
{
my ($id) = @_;
# I'd like to use //, but I guess some people are still on perl 5.8
return
exists $options{rangesize_hash}{$id} ?
$options{rangesize_hash}{$id} :
$options{rangesize_default};
}
sub interpretCommandline
{
# if I'm using a self-plotting data file with a #! line, then $ARGV[0] will contain ALL of the
@@ -97,21 +102,24 @@ sub interpretCommandline
$options{with} = '';
$options{rangesize} = [];
$options{tuplesize} = [];
GetOptions(\%options, 'stream:s', 'domain!', 'dataid!', '3d!', 'colormap!', 'lines!', 'points!',
GetOptions(\%options, 'stream:s', 'domain!', 'dataid!', 'vnlog!', '3d!', 'colormap!', 'lines!', 'points!',
'circles', 'legend=s{2}', 'autolegend!', 'xlabel=s', 'ylabel=s', 'y2label=s', 'zlabel=s',
'title=s', 'xlen=f', 'ymin=f', 'ymax=f', 'xmin=s', 'xmax=s', 'y2min=f', 'y2max=f',
'zmin=f', 'zmax=f', 'y2=s@',
'style=s{2}', 'curvestyle=s{2}', 'curvestyleall=s', 'styleall=s', 'with=s', 'extracmds=s@', 'set=s@', 'unset=s@',
'square!', 'square_xy!', 'hardcopy=s', 'maxcurves=i', 'monotonic!', 'timefmt=s',
'equation=s@',
'image=s',
'histogram=s@', 'binwidth=f', 'histstyle=s',
'terminal=s',
'rangesize=s{2}', 'rangesizeall=i', 'extraValuesPerPoint=i',
'rangesize=s{2}', 'rangesizeall=i',
'tuplesize=s{2}', 'tuplesizeall=i',
'extraValuesPerPoint=i', # deprecated and undocumented
'help', 'dump', 'exit', 'version',
'geometry=s') or exit 1;
# handle various cmdline-option errors
if ( $options{help} )
{
@@ -149,6 +157,11 @@ sub interpretCommandline
delete $options{with};
}
if( $options{dataid} && $options{vnlog} )
{
print STDERR "--dataid and --vnlog are mutually exclusive. Please just use one.\n";
exit -1;
}
# expand options that are given as comma-separated lists
for my $listkey (qw(histogram y2))
@@ -156,7 +169,7 @@ sub interpretCommandline
@{$options{$listkey}} = map split('\s*,\s*', $_), @{$options{$listkey}}
if defined $options{$listkey};
}
for my $listkey (qw(curvestyle rangesize))
for my $listkey (qw(curvestyle rangesize tuplesize))
{
next unless defined $options{$listkey};
my @in = @{$options{$listkey}};
@@ -176,6 +189,35 @@ sub interpretCommandline
}
# convert all tuplesize business to rangesize
my $domainsize = $options{'3d'} ? 2 : 1;
if (defined $options{tuplesizeall})
{
if (defined $options{rangesizeall} )
{
print STDERR "Only one of --rangesizeall and --tuplesizeall may be given\n";
exit -1;
}
$options{rangesizeall} = $options{tuplesizeall} - $domainsize;
delete $options{tuplesizeall};
}
if (defined $options{tuplesize})
{
$options{rangesize} //= [];
my $N = @{$options{tuplesize}} / 2;
for my $i (0..$N-1)
{
$options{tuplesize}[2*$i + 1] -= $domainsize;
}
push @{$options{rangesize}}, @{$options{tuplesize}};
delete $options{tuplesize};
}
# If we're plotting histograms, then set the default histogram options for
# each histogram curve
#
@@ -222,7 +264,10 @@ sub interpretCommandline
# I now set up the rangesize to always be
#
# $options{rangesize_hash}{$id} // $options{rangesize_default}
#
# which is available as getRangeSize($id)
if ( $options{rangesizeall} )
{
$options{rangesize_default} = $options{rangesizeall};
@@ -281,6 +326,13 @@ sub interpretCommandline
$options{curvestyleall} .= ' palette';
}
if ( defined $options{binwidth} && !@{$options{histogram}} )
{
print STDERR "--binwidth doesn't make sense without any histograms\n";
exit -1;
}
if ( $options{'3d'} )
{
if ( !$options{domain} )
@@ -313,7 +365,7 @@ sub interpretCommandline
exit -1;
}
if ( defined $options{binwidth} || @{$options{histogram}} )
if ( @{$options{histogram}} )
{
print STDERR "--3d does not make sense with histograms\n";
exit -1;
@@ -347,6 +399,16 @@ sub interpretCommandline
print STDERR "--square_xy only makes sense with --3d\n";
exit -1;
}
for my $hist_curve(@{$options{histogram}})
{
my $hist_dim = getRangeSize($hist_curve);
if( $hist_dim != 1 )
{
print STDERR "I only support 1D histograms, but curve '$hist_curve' has '$hist_dim'-D data\n";
exit -1;
}
}
}
if(defined $options{xlen} && !$options{stream} )
@@ -356,7 +418,8 @@ sub interpretCommandline
}
if($options{stream} && defined $options{xlen} &&
( defined $options{xmin} || defined $options{xmax}))
( defined $options{xmin} || defined $options{xmax}) &&
!defined $options{histogram})
{
print STDERR "With --stream and --xlen the X bounds are set, so neither --xmin nor --xmax make sense\n";
exit -1;
@@ -395,6 +458,30 @@ sub interpretCommandline
}
}
}
# deal with --image. I just fill in --equation, and reverse the y extents if
# none are explicitly given
if( defined $options{image} )
{
# images generally have the origin at the top-left instead of the
# bottom-left, so given nothing else, I flip the y axis
if( !defined $options{xmin} && !defined $options{xmax} &&
!defined $options{ymin} && !defined $options{ymax} &&
! any { /^ *xrange\b/ } @{$options{set}} &&
! any { /^ *yrange\b/ } @{$options{set}} )
{
push @{$options{set}}, "xrange [:] noextend";
push @{$options{set}}, "yrange [:] reverse noextend";
}
if ( ! -r $options{image} )
{
die "Couldn't read image '$options{image}'";
}
unshift @{$options{equation}}, qq{"$options{image}" binary filetype=auto flipy with rgbimage title "$options{image}"};
delete $options{image};
}
}
sub getGnuplotVersion
@@ -447,16 +534,66 @@ sub makeDomainNumeric
}
my $prev_timed_replot_time = [gettimeofday];
my $pipe_in;
my $selector;
my $line_number = 0;
my $is_stdin = !@ARGV; # read stdin only if no data files given on the cmdline
sub openNextFile
{
my $fd;
if($is_stdin)
{
$fd = IO::Handle->new();
$fd->fdopen(fileno(STDIN), "r") or die "Couldn't open STDIN";
}
else
{
my $filename = shift @ARGV;
$fd = IO::File->new($filename, "r") or die "Couldn't open file '$filename'";
}
my $selector = IO::Select->new( $fd );
return ($fd, $selector);
}
sub getNextLine
{
sub getline_internal
{
while(1)
{
my $line = $pipe_in->getline();
if( !$is_stdin && !defined $line && $pipe_in->eof() && @ARGV)
{
# I got to the end of one file, so open the next one (which I'm
# sure exists)
($pipe_in, $selector) = openNextFile();
next;
}
return $line;
}
}
if( !defined $pipe_in )
{
($pipe_in, $selector) = openNextFile();
}
while(1)
{
$this_replot_is_from_timer = undef;
# if we're not streaming, or we're doing triggered-only replotting, simply
# do a blocking read
return $stdin->getline()
if (! $options{stream} || $options{stream} < 0);
if (! $options{stream} || $options{stream} < 0)
{
$line_number++;
return getline_internal();
}
my $now = [gettimeofday];
@@ -471,7 +608,8 @@ sub getNextLine
if ($selector->can_read($time_remaining))
{
return $stdin->getline();
$line_number++;
return getline_internal();
}
}
}
@@ -622,11 +760,6 @@ sub mainThread
print(PIPE "set xdata time\n");
}
# add the extra global options
print(PIPE "$_\n") foreach (@{$options{extracmds}});
print(PIPE "set $_\n") foreach (@{$options{set}});
print(PIPE "unset $_\n") foreach (@{$options{unset}});
# set up histograms
$options{binwidth} ||= 1; # if no binwidth given, set it to 1
print PIPE
@@ -649,6 +782,11 @@ sub mainThread
sendRangeCommand( "zrange", $options{zmin}, $options{zmax} );
sendRangeCommand( "cbrange", $options{zmin}, $options{zmax} ) if($options{colormap});
# add the extra global options
print(PIPE "$_\n") foreach (@{$options{extracmds}});
print(PIPE "set $_\n") foreach (@{$options{set}});
print(PIPE "unset $_\n") foreach (@{$options{unset}});
@@ -658,6 +796,41 @@ sub mainThread
# The domain of the current point
my @domain;
# column headers from vnlog
my @vnlog_headers;
if($options{vnlog})
{
require Vnlog::Parser;
require Vnlog::Util;
if ( !defined $pipe_in )
{
($pipe_in, $selector) = openNextFile();
}
my $parser = Vnlog::Parser->new();
while (defined ($_ = Vnlog::Util::get_unbuffered_line($pipe_in)))
{
if ( !$parser->parse($_) )
{
die "Error parsing vnlog: $parser->{error}; looking at line '$_'";
}
my $keys = $parser->getKeys();
if (defined $keys)
{
@vnlog_headers = @$keys;
last;
}
}
if(!@vnlog_headers)
{
die "Looked through all of the first file, and never saw a vnlog legend";
}
}
# The x-axis domain represented as a number. This is exactly the same as
# $domain[0] unless the x-axis domain uses a timefmt. Then this is the
# number of seconds since the UNIX epoch.
@@ -695,6 +868,7 @@ sub mainThread
# 3d plots require $options{domain}, and dictate "x y" for the domain instead of just "x"
my @fields = split;
my $i_column = 0;
if($options{domain})
{
@@ -706,6 +880,7 @@ sub mainThread
$domain[0] = join (' ', splice( @fields, 0, $options{timefmt_Ncols}) );
$domain0_numeric = makeDomainNumeric( $domain[0] );
$i_column += $options{timefmt_Ncols};
}
elsif(!$options{'3d'})
{
@@ -714,6 +889,7 @@ sub mainThread
next if @fields < 1+1;
$domain[0] = $domain0_numeric = shift @fields;
$i_column += 1;
}
else
{
@@ -722,6 +898,7 @@ sub mainThread
next if @fields < 2+1;
@domain = splice(@fields, 0, 2);
$i_column += 2;
}
if( $options{monotonic} )
@@ -741,28 +918,34 @@ sub mainThread
}
else
{
$domain[0] = $.;
$domain[0] = $line_number;
$domain0_numeric = makeDomainNumeric( $domain[0] );
}
my $id = -1;
while(@fields)
{
if ($options{dataid})
{
$id = shift @fields;
}
elsif($options{vnlog} )
{
if( $i_column >= @vnlog_headers )
{
# Got more columns than vnlog headers. The data is probably
# bogus, but I don't want to barf at the user, so I silently
# ignore the data
last;
}
$id = $vnlog_headers[$i_column];
}
else
{
$id++;
}
# I'd like to use //, but I guess some people are still on perl 5.8
my $rangesize = exists $options{rangesize_hash}{$id} ?
$options{rangesize_hash}{$id} :
$options{rangesize_default};
my $rangesize = getRangeSize($id);
last if @fields < $rangesize;
pushPoint(getCurve($id),
@@ -770,6 +953,8 @@ sub mainThread
@domain,
splice( @fields, 0, $rangesize ) ) . "\n",
$domain0_numeric);
$i_column += $rangesize;
}
}
@@ -805,7 +990,10 @@ sub mainThread
# we persist gnuplot, so we shouldn't need this sleep. However, once
# gnuplot exits, but the persistent window sticks around, you can no
# longer interactively zoom the plot. So we still sleep
sleep(100000000) unless $options{dump} || $options{exit};
unless($options{dump} || $options{exit})
{
print PIPE "pause mouse close\n";
}
}
sub pruneOldData
@@ -886,17 +1074,13 @@ sub updateCurveOptions
# as 1 + rangesize). I also need to start the range at the first column
# past the timefmt
# I'd like to use //, but I guess some people are still on perl 5.8
my $rangesize = exists $options{rangesize_hash}{$id} ?
$options{rangesize_hash}{$id} :
$options{rangesize_default};
my @rest = map {$_ + $options{timefmt_Ncols}} (1..$rangesize);
my @rest = map {$_ + $options{timefmt_Ncols}} (1..getRangeSize($id));
$usingoptions = "using 1:" . join(':', @rest);
}
$curve->{options} = "$histoptions $usingoptions $titleoption $curve->{extraoptions} $options{curvestyleall}";
$curve->{options} = "$histoptions $usingoptions $titleoption $curve->{extraoptions}";
}
sub getCurve
@@ -915,13 +1099,33 @@ sub getCurve
if( !exists $curveIndices{$id} )
{
push @curves, {extraoptions => ' ',
push @curves, {# if we have a catch-all style and no specific style, use
# the catch-all style
extraoptions => (!exists $options{curvestyle_hash}{$id} &&
exists $options{curvestyleall}) ?
"$options{curvestyleall} " : ' ',
datastring => '',
datastring_meta => [],
datastring_offset => 0}; # push a curve with no data and no options
$curveIndices{$id} = $#curves;
updateCurveOptions($curves[$#curves], $id);
# --xlen has a meaning if we're not plotting histograms at all or if we're
# plotting ONLY histograms. If we're doing both at the same time, there's no
# consistent way to assign meaning to xlen
if ( defined $options{xlen} &&
# have at least some histograms
@{$options{histogram}} &&
# there are more curves than histogram curves, i.e. there're some
# non-histogram curves
@curves > @{$options{histogram}} ) {
print STDERR "--xlen only makes sense when plotting ONLY histograms or ONLY NON-histograms\n";
exit -1;
}
}
return $curves[$curveIndices{$id}];
}
@@ -949,6 +1153,10 @@ sub setCurveAsHistogram
my ($id, $str) = @_;
my $curve = getCurve($id);
# With histograms I have 2d plots with rangesize=1. I thus give gnuplot two
# values for each point: a domain and a range. For histograms I ignore the
# domain, so I get the statistics of the 2nd column: $2
$curve->{histoptions} = 'using (histbin($2)):(1.0) smooth ' . $options{histstyle};
updateCurveOptions($curve, $id);
@@ -1016,7 +1224,11 @@ sub replot
# seconds-since-the-epoch BACK to the timefmt. Sheesh
($xmin, $xmax) = map {Time::Piece->strptime( $_, '%s' )->strftime( $options{timefmt} ) } ($xmin, $xmax);
}
sendRangeCommand( "xrange", $xmin, $xmax );
# if we have any histograms, then I'm not really visualizing the domain at
# all, and I don't set the range.
sendRangeCommand( "xrange", $xmin, $xmax )
unless @{$options{histogram}};
}
plotStoredData();
@@ -1041,6 +1253,9 @@ sub pushPoint
}
mainThread();
=head1 NAME
feedgnuplot - General purpose pipe-oriented plotting tool
@@ -1058,45 +1273,45 @@ Simple plotting of piped data:
$ seq 5 | awk '{print 2*$1, $1*$1}' |
feedgnuplot --lines --points --legend 0 "data 0" --title "Test plot" --y2 1
--terminal 'dumb 80,40' --exit
--unset grid --terminal 'dumb 80,40' --exit
Test plot
10 ++------+--------+-------+-------+-------+--------+-------+------*A 25
+ + + + + + + + **#+
| : : : : : : data 0+**A*** |
| : : : : : : :** # |
9 ++.......................................................**.##....|
| : : : : : : ** :# |
| : : : : : : ** # |
| : : : : : :** ##: ++ 20
8 ++................................................A....#..........|
| : : : : : **: # : |
| : : : : : ** : ## : |
| : : : : : ** :# : |
| : : : : :** B : |
7 ++......................................**......##................|
| : : : : ** : ## : : ++ 15
| : : : : ** : # : : |
| : : : :** : ## : : |
6 ++..............................*A.......##.......................|
| : : : ** : ##: : : |
| : : : ** : # : : : |
| : : :** : ## : : : ++ 10
5 ++......................**........##..............................|
| : : ** : #B : : : |
| : : ** : ## : : : : |
| : :** : ## : : : : |
4 ++...............A.......###......................................|
| : **: ##: : : : : |
| : ** : ## : : : : : ++ 5
| : ** : ## : : : : : |
| :** ##B# : : : : : |
3 ++.....**..####...................................................|
| **#### : : : : : : |
| **## : : : : : : : |
B** + + + + + + + +
2 A+------+--------+-------+-------+-------+--------+-------+------++ 0
10 +-----------------------------------------------------------------+ 25
| + + + + + + + *##|
| data 0 ***A*#* |
| ** # |
9 |-+ ** ## |
| ** # |
| ** # |
| ** ## +-| 20
8 |-+ A # |
| ** # |
| ** ## |
| ** # |
| ** B |
7 |-+ ** ## |
| ** ## +-| 15
| ** # |
| ** ## |
6 |-+ *A ## |
| ** ## |
| ** # |
| ** ## +-| 10
5 |-+ ** ## |
| ** #B |
| ** ## |
| ** ## |
4 |-+ A ### |
| ** ## |
| ** ## +-| 5
| ** ## |
| ** ##B# |
3 |-+ ** #### |
| **#### |
| #### |
|## + + + + + + + |
2 +-----------------------------------------------------------------+ 0
1 1.5 2 2.5 3 3.5 4 4.5 5
@@ -1164,41 +1379,64 @@ with the I<X>-value at the start of that line.
=head3 Curve indexing
By default, each column represents a separate curve. This is fine unless sparse
data is to be plotted. With the C<--dataid> option, each point is represented by
2 values: a string identifying the curve, and the value itself. If we add
C<--dataid> to the original example:
We index the curves in one of 3 ways: sequentially, explicitly with a
C<--dataid> or by C<--vnlog> headers.
By default, each column represents a separate curve. The first column (after any
domain) is curve C<0>. The next one is curve C<1> and so on. This is fine unless
sparse data is to be plotted. With the C<--dataid> option, each point is
represented by 2 values: a string identifying the curve, and the value itself.
If we add C<--dataid> to the original example:
$ seq 5 | awk '{print 2*$1, $1*$1}' | feedgnuplot --dataid --autolegend
we get 5 different curves with one point in each. The first column, as produced
by C<awk>, is B<2,4,6,8,10>. These are interpreted as the IDs of the curves to
be plotted. The C<--autolegend> option adds a legend using the given IDs to
be plotted.
If we're plotting C<vnlog> data (L<https://www.github.com/dkogan/vnlog>) then we
can get the curve IDs from the vnlog header. Vnlog is a trivial data format
where lines starting with C<#> are comments and the first comment contains
column labels. If we have such data, C<feedgnuplot --vnlog> can interpret these
column labels if the C<vnlog> perl modules are available.
The C<--autolegend> option adds a legend using the given IDs to
label the curves. The IDs need not be numbers; generic strings are accepted. As
many points as desired can appear on a single line. C<--domain> can be used in
conjunction with C<--dataid>.
conjunction with C<--dataid> or C<--vnlog>.
=head3 Multi-value style support
Depending on how gnuplot is plotting the data, more than one value may be needed
to represent the range of a single point. Basic 2D plots have 2 numbers
representing each point: 1 domain and 1 range. But if plotting with
C<--circles>, for instance, then there's an extra range value: the radius. A
similar situation exists with C<--colormap> where each point contains the
position I<and> the color. There are other gnuplot styles that require more data
(such as error bars), but none of these are directly supported by the script.
They can still be used, however, by specifying the specific style with
C<--style>, and specifying how many values are needed for each point with
C<--rangesizeall> or C<--rangesize> or C<--extraValuesPerPoint>. Those options
that specify the range size are required I<only> for styles not explicitly
supported by feedgnuplot; supported styles do the right thing automatically.
C<--circles>, for instance, then there's an extra range value: the radius. Many
other gnuplot styles require more data: errorbars, variable colors (C<with
points palette>), variable sizes (C<with points ps variable>), labels and so on.
The feedgnuplot tool itself does not know about all these intricacies, but they
can still be used, by specifying the specific style with C<--style>, and
specifying how many values are needed for each point with any of
C<--rangesizeall>, C<--tuplesizeall>, C<--rangesize>, C<--tuplesize>. These
options are required I<only> for styles not explicitly supported by feedgnuplot;
supported styles do the right thing automatically.
More examples: if making a 2d plot of y error bars where gnuplot expects a
(x,y,ydelta) tuple for each point, you want C<--rangesizeall 2> because you have
one domain value (x) and 2 range values (y,ydelta). Gnuplot can also plot
lopsided y errorbars by giving a tuple (x,y,ylow,yhigh). This is similar as
before, but you want C<--rangesizeall 3> instead.
Specific example: if making a 2d plot of y error bars, the exact format can be
queried by running C<gnuplot> and invoking C<help yerrorbars>. This tells us
that there's a 3-column form: C<x y ydelta> and a 4-column form: C<x y ylow
yhigh>. With 2d plots feedgnuplot will always output the 1-value domain C<x>, so
the rangesize is 2 and 3 respectively. Thus the following are equivalent:
$ echo '1 2 0.3
2 3 0.4
3 4 0.5' | feedgnuplot --domain --rangesizeall 2 --with 'yerrorbars'
$ echo '1 2 0.3
2 3 0.4
3 4 0.5' | feedgnuplot --domain --tuplesizeall 3 --with 'yerrorbars'
$ echo '1 2 1.7 2.3
2 3 2.6 3.4
3 4 3.5 4.5' | feedgnuplot --domain --rangesizeall 3 --with 'yerrorbars'
=head3 3D data
@@ -1265,7 +1503,12 @@ windowsize> can be given. This will create an constantly-updating, scrolling
view of the recent past. C<windowsize> should be replaced by the desired length
of the domain window to plot, in domain units (passed-in values if C<--domain>
or line numbers otherwise). If the domain is a time/date via C<--timefmt>, then
C<windowsize> is and I<integer> in seconds.
C<windowsize> is and I<integer> in seconds. If we're plotting a histogram, then
C<--xlen> causes a histogram over a moving window to be computed. The subtlely
here is that with a histogram you don't actually I<see> the domain since only
the range is analyzed. But the domain is still there, and can be utilized with
C<--xlen>. With C<--xlen> we can plot I<only> histograms or I<only>
I<non>-histograms.
=head3 Special data commands
@@ -1427,6 +1670,19 @@ point in curve ID 20
=item
C<--vnlog>
Vnlog is a trivial data format where lines starting with C<#> are comments and
the first comment contains column labels. Some tools for working with such data
are available from the C<vnlog> project: L<https://www.github.com/dkogan/vnlog>.
With the C<vnlog> perl modules installed, we can read the vnlog column headers
with C<feedgnuplot --vnlog>. This replaces C<--dataid>, and we can do all the
normal things with these headers. For instance C<feedgnuplot --vnlog
--autolegend> will generate plot legends for each column in the vnlog, using the
vnlog column label in the legend.
=item
C<--[no]3d>
Do [not] plot in 3D. This only makes sense with C<--domain>. Each domain here is
@@ -1443,7 +1699,8 @@ Interpret the X data as a time/date, parsed with the given format
C<--colormap>
Show a colormapped xy plot. Requires extra data for the color. zmin/zmax can be
used to set the extents of the colors. Automatically sets the C<--rangesize>.
used to set the extents of the colors. Automatically sets the
C<--rangesize>/C<--tuplesize>.
=item
@@ -1471,7 +1728,8 @@ Do [not] draw points
C<--circles>
Plot with circles. This requires a radius be specified for each point.
Automatically sets the C<--rangesize>. C<Not> supported for 3d plots.
Automatically sets the C<--rangesize>/C<--tuplesize>. C<Not> supported for 3d
plots.
=item
@@ -1499,7 +1757,12 @@ C<--xlen xxx>
When using C<--stream>, sets the size of the x-window to plot. Omit this or set
it to 0 to plot ALL the data. Does not make sense with 3d plots. Implies
C<--monotonic>
C<--monotonic>. If we're plotting a histogram, then C<--xlen> causes a histogram
over a moving window to be computed. The subtlely here is that with a histogram
you don't actually I<see> the domain since only the range is analyzed. But the
domain is still there, and can be utilized with C<--xlen>. With C<--xlen> we can
plot I<only> histograms or I<only> I<non>-histograms.
=item
@@ -1507,7 +1770,10 @@ C<--xmin/xmax/ymin/ymax/y2min/y2max/zmin/zmax xxx>
Set the range for the given axis. These x-axis bounds are ignored in a streaming
plot. The y2-axis bound do not apply in 3d plots. The z-axis bounds apply
I<only> to 3d plots or colormaps.
I<only> to 3d plots or colormaps. Note that there is no C<--xrange> to set both
sides at once or C<--xinv> to flip the axis around: anything more than the
basics supported in this option is clearly obtainable by talking to gnuplot, for
instance C<--set 'xrange [20:10]'> to set the given inverted bounds.
=item
@@ -1541,8 +1807,9 @@ specified for this curve (C<--curvestyle>) or all curves (C<--with>,
C<--curvestyleall>) then the default histogram style is set: filled boxes with
borders. This is what the user generally wants. This works with C<--domain>
and/or C<--stream>, but in those cases the x-value is used I<only> to cull old
data because of C<--xlen> or C<--monotonic>. I.e. the x-values are I<not> drawn
in any way. Can be passed multiple times, or passed a comma- separated list
data because of C<--xlen> or C<--monotonic>. I.e. the domain values are I<not>
drawn in any way. Can be passed multiple times, or passed a comma- separated
list
=item
@@ -1631,15 +1898,26 @@ times.
=item
C<--image filename>
Overlays the data on top of a raster image given in C<filename>. This is passed
through to gnuplot via C<--equation>, and is not interpreted by C<feedgnuplot>
other than checking for existence. Usually images have their origin at the
top-left corner, while plots have it in the bottom-left corner instead. Thus if
the y-axis extents are not specified (C<--ymin>, C<--ymax>, C<--set 'yrange
...'>) this option will also flip around the y axis to make the image appear
properly. Since this option is just a passthrough to gnuplot, finer control can
be achieved by passing in C<--equation> and C<--set yrange ...> directly.
C<--equation xxx>
Gnuplot can plot both data and symbolic equations. C<feedgnuplot> generally
plots data, but with this option can plot symbolic equations I<also>. This is
generally intended to augment data plots, since for equation-only plots you
don't need C<feedgnuplot>. C<--equation> can be passed multiple times for
multiple equations. The given strings are passed to gnuplot directly without any
thing added or removed, so styling and such should be applied in the string. A
basic example:
multiple equations. The given strings are passed to gnuplot directly without
anything added or removed, so styling and such should be applied in the string.
A basic example:
seq 100 | awk '{print $1/10, $1/100}' |
feedgnuplot --with 'lines lw 3' --domain --ymax 1
@@ -1689,7 +1967,7 @@ file type is desired, use both C<--hardcopy> and C<--terminal>
=item
C<--maxcurves xxx>
C<--maxcurves N>
The maximum allowed number of curves. This is 100 by default, but can be reset
with this option. This exists purely to prevent perl from allocating all of the
@@ -1702,17 +1980,19 @@ C<--monotonic>
If C<--domain> is given, checks to make sure that the x-coordinate in the input
data is monotonically increasing. If a given x-variable is in the past, all data
currently cached for this curve is purged. Without C<--monotonic>, all data is
kept. Does not make sense with 3d plots. No C<--monotonic> by default. The data is
replotted before being purged
kept. Does not make sense with 3d plots. No C<--monotonic> by default. The data
is replotted before being purged. This is useful in streaming plots where the
incoming data represents multiple iterations of the same process (repeated
simulations of the same period in time, for instance).
=item
C<--rangesize curveID xxx>
C<--rangesize curveID N>
The options C<--rangesizeall>, C<--rangesize> and C<--extraValuesPerPoint> set
the number of values are needed to represent each point being plotted (see
L</"Multi-value style support"> above). These options are I<only> needed if
unknown styles are used, with C<--styleall> or C<--with> for instance.
The options C<--rangesizeall> and C<--rangesize> set the number of values are
needed to represent each point being plotted (see L</"Multi-value style
support"> above). These options are I<only> needed if unknown styles are used,
with C<--styleall> or C<--with> for instance.
C<--rangesize> is used to set how many values are needed to represent the range
of a point for a particular curve. This overrides any defaults that may exist
@@ -1724,19 +2004,25 @@ rangesize should apply.
=item
C<--rangesizeall xxx>
C<--tuplesize curveID N>
Very similar to C<--rangesize>, but instead of specifying the I<range> only,
this specifies the whole tuple. For instance if we're plotting circles, the
tuplesize is 3: C<x,y,radius>. In a 2D plot there's a 1-dimensional domain:
C<x>, so the rangesize is 2: C<y,radius>. This dimensionality can be given
either way.
=item
C<--rangesizeall N>
Like C<--rangesize>, but applies to I<all> the curves.
C<--extraValuesPerPoint xxx>
=item
Like C<--rangesizeall>, but instead of overriding the default, adds to it. For
example, if plotting non-lopsided y errorbars gnuplot wants (x,y,ydelta) tuples.
These can be specified both with C<--rangesizeall 2> (because there are 2 range
values) or C<--extraValuesPerPoint 1> (because there's 1 more value than usual).
C<--tuplesizeall N>
This option is I<only> needed if unknown styles are used, with C<--styleall> or
C<--with> for instance.
Like C<--tuplesize>, but applies to I<all> the curves.
=item
@@ -1749,16 +2035,15 @@ is possible to send the output produced this way to gnuplot directly.
C<--exit>
This controls the details of what happens when the input data is exhausted, or
when some part of the C<feedgnuplot> pipeline is killed. This option does
different things depending on whether C<--stream> is active, so read this
closely.
This controls what happens when the input data is exhausted, or when some part
of the C<feedgnuplot> pipeline is killed. This option does different things
depending on whether C<--stream> is active, so read this closely.
With interactive gnuplot terminals (qt, x11, wxt), the plot windows live in a
separate process from the main C<gnuplot> process. It is thus possible for the
main C<gnuplot> process to exit, while leaving the plot windows up (a caveat is
that such decapitated windows aren't interactive). To be clear, there are 3
possible states:
that such decapitated windows aren't interactive). There are 3 possible states
of the polotting pipeline:
=over
@@ -1773,35 +2058,35 @@ prompt available
=back
The C<--exit> option controls the details of this behavior. The possibilities
are:
The possibilities are:
=over
=item No C<--stream>, input pipe is exhausted (all data read in)
=item No C<--stream>, all data read in
=over
=item default; no C<--exit>
=item no C<--exit> (default)
Alive. Need to Ctrl-C to get back into the shell
=item C<--exit>
Half-alive. Non-interactive prompt up, and the shell accepts new commands.
Without C<--stream> the goal is to show a plot, so a Dead state is not useful
here.
Without C<--stream> the goal is to show a plot, so a Dead state would not be
useful.
=back
=item C<--stream>, input pipe is exhausted (all data read in) or the
C<feedgnuplot> process terminated
=item C<--stream>, all data read in or the C<feedgnuplot> process terminated
=over
=item default; no C<--exit>
=item no C<--exit> (default)
Alive. Need to Ctrl-C to get back into the shell
Alive. Need to Ctrl-C to get back into the shell. This means that when making
live plots, the first Ctrl-C kills the data feeding process, but leaves the
final plot up for inspection. A second Ctrl-C kills feedgnuplot as well.
=item C<--exit>
@@ -1883,13 +2168,34 @@ in a Thinkpad.
--binwidth 10
--ymin 0 --xlabel 'File size (MB)' --ylabel Frequency
=head2 Plotting a live histogram of the ping round-trip times for the past 20 seconds
$ ping -A -D 8.8.8.8 |
perl -anE 'BEGIN { $| = 1; }
$F[0] =~ s/[\[\]]//g or next;
$F[7] =~ s/.*=//g or next;
say "$F[0] $F[7]"' |
feedgnuplot --stream --domain --histogram 0 --binwidth 10 \
--xlabel 'Ping round-trip time (s)' \
--ylabel Frequency --xlen 20
=head2 Plotting points on top of an existing image
This can be done by using C<--equation> to pass arbitrary plot input to gnuplot:
This can be done with C<--image>:
$ < features_xy.data
feedgnuplot --points --domain --image "image.png"
or with C<--equation>:
$ < features_xy.data
feedgnuplot --points --domain
--equation '"image.png" binary filetype=png flipy with rgbimage'
--equation '"image.png" binary filetype=auto flipy with rgbimage'
--set 'yrange [:] reverse'
The C<--image> invocation is a convenience wrapper for the C<--equation>
version. Finer control is available with C<--equation>.
Here an existing image is given to gnuplot verbatim, and data to plot on top of
it is interpreted by feedgnuplot as usual. C<flipy> is useful here because

View File

@@ -21,6 +21,7 @@ complete -W \
--set \
--unset \
--equation \
--image \
--geometry \
--hardcopy \
--help \

View File

@@ -16,7 +16,7 @@ _arguments -S
'--zlabel:Z-axis label:' \
'--title:Plot title:' \
'--autolegend[Label each plot with its data ID]' \
'(--3d)--xlen[the size of the x-window to plot]::window size:' \
'(--3d)--xlen[the size of the x-window to plot]:window size:' \
'(--xlen)--xmin:min X:' \
'(--xlen)--xmax:max X:' \
'--ymin:min Y:' \
@@ -33,9 +33,10 @@ _arguments -S
'*--set[Additional 'set' gnuplot commands]:set-option' \
'*--unset[Additional 'unset' gnuplot commands]:unset-option' \
'*--equation[Raw symbolic equation]:equation' \
'--image[Image file to render beneath the data]:image:_files -g "(#i)*.(jpg|jpeg|png|gif)"' \
'--square[Plot data with square aspect ratio]' \
'--square_xy[For 3D plots, set square aspect ratio for ONLY the x,y axes]' \
'--hardcopy[Plot to a file]:filename' \
'--hardcopy[Plot to a file]:new image filename:_files -g "(#i)*.(jpg|jpeg|png|gif)"' \
'--maxcurves[The maximum allowed number of curves]:number of curves' \
'(--3d)--monotonic[Resets plot if an X in the past is seen]' \
'(--rangesizeall)--extraValuesPerPoint[How many extra values are given for each data range]:N'\
@@ -47,7 +48,7 @@ _arguments -S
'*--style[Additional styles for a curve]:curve id: :style:' \
'(--3d)*--histogram:plot to treat as a histogram:' \
'--binwidth:Histogram bin width:' \
'--histstyle:Style of histogram:(frequency unique cumulative cnormal)' \
'--histstyle:Style of histogram:(frequency fnormal unique cumulative cnormal)' \
'--terminal:Terminal options to set with "set terminal":' \
'*--legend[Legend for a curve]:curve id: :legend:' \
'--exit[Exit gnuplot after making the plot]' \

72
debian/changelog vendored
View File

@@ -1,3 +1,75 @@
feedgnuplot (1.50-1) unstable; urgency=medium
* Script waits for the plot window to close before exiting
Instead of sleeping forever. This is really nice! I no longer need
to quit the plot window AND then C-c. Quitting the plot window is
now sufficient
* by default --image sets range noextend
* tab-completion knows about the fnormal distribution
-- Dima Kogan <dkogan@debian.org> Fri, 24 Aug 2018 13:16:35 -0700
feedgnuplot (1.49-2) unstable; urgency=medium
* Updated Vcs-... tags to salsa
-- Dima Kogan <dkogan@debian.org> Sun, 17 Jun 2018 22:18:18 -0700
feedgnuplot (1.49-1) unstable; urgency=medium
* --vnl now works with plots that have rangesize > 1
* zsh completion: --xlen argument isn't optional
-- Dima Kogan <dkogan@debian.org> Fri, 16 Mar 2018 13:56:27 -0700
feedgnuplot (1.48-1) unstable; urgency=medium
* Added --tuplesize and --tuplesizeall
* vnlog integration
-- Dima Kogan <dkogan@debian.org> Sat, 24 Feb 2018 12:56:05 -0800
feedgnuplot (1.45-1) unstable; urgency=medium
* zsh completion: --hardcopy, --image suggest filenames
* --image now produces a nicer legend: just the filename
* --curvestyle now overrides --curvestyleall
- This is a bug fix
* The version is now treated as a string not as a number
- So "1.40" is distinct from "1.4"
-- Dima Kogan <dkogan@debian.org> Sun, 29 Oct 2017 14:06:26 -0700
feedgnuplot (1.44-1) unstable; urgency=medium
* --image always goes on the FRONT of the equation list
-- Dima Kogan <dkogan@debian.org> Tue, 20 Jun 2017 16:45:42 -0700
feedgnuplot (1.43-1) unstable; urgency=medium
* added --image as a convenience wrapper for --equation
-- Dima Kogan <dkogan@debian.org> Mon, 19 Jun 2017 13:16:18 -0700
feedgnuplot (1.42-1) unstable; urgency=medium
* Upstream update:
- Fixed regression: data can now come from STDIN or files on the
cmdline
- reworded manpage of --exit
-- Dima Kogan <dkogan@debian.org> Tue, 25 Apr 2017 11:02:18 -0700
feedgnuplot (1.41-1) unstable; urgency=medium
* Upstream update:
- Histograms: --xlen can coexist with --xmin/--xmax
- Histograms: work as expected with --xlen and --monotonic
- Histograms: better sanity checking of options
-- Dima Kogan <dkogan@debian.org> Fri, 24 Feb 2017 23:53:27 -0800
feedgnuplot (1.40-1) unstable; urgency=medium
* Upstream update:

4
debian/control vendored
View File

@@ -6,8 +6,8 @@ Maintainer: Debian Science Maintainers <debian-science-maintainers@lists.alioth.
Uploaders: Dima Kogan <dima@secretsauce.net>
Standards-Version: 3.9.4
Homepage: https://github.com/dkogan/feedgnuplot
Vcs-Git: git://anonscm.debian.org/debian-science/packages/feedgnuplot.git
Vcs-Browser: http://anonscm.debian.org/gitweb/?p=debian-science/packages/feedgnuplot.git
Vcs-Browser: https://salsa.debian.org/science-team/feedgnuplot
Vcs-Git: https://salsa.debian.org/science-team/feedgnuplot.git
Package: feedgnuplot
Architecture: all

View File

@@ -1,2 +1,2 @@
completions/bash/feedgnuplot /etc/bash_completion.d/
completions/bash/feedgnuplot /usr/share/bash-completion/completions/
completions/zsh/_feedgnuplot /usr/share/zsh/vendor-completions