summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Changes1
-rw-r--r--dist.ini4
-rw-r--r--lib/Reply/Plugin/Pager.pm62
3 files changed, 67 insertions, 0 deletions
diff --git a/Changes b/Changes
index 96cbc8a..a61a1c2 100644
--- a/Changes
+++ b/Changes
@@ -2,6 +2,7 @@ Revision history for Reply
{{$NEXT}}
- add #vars command to list currently in scope variable names (garu, #39)
+ - add Reply::Plugin::Pager to page long results (y, #47)
0.40 2016-06-25
- fix docs (y, #49)
diff --git a/dist.ini b/dist.ini
index c043a7e..b3b00ba 100644
--- a/dist.ini
+++ b/dist.ini
@@ -27,9 +27,11 @@ skip = ^Carp::Always$
skip = ^Class::Refresh$
skip = ^Data::Dump$
skip = ^Data::Printer$
+skip = ^IO::Pager$
skip = ^mro$
skip = ^MRO::Compat$
skip = ^Proc::InvokeEditor$
+skip = ^Term::ReadKey$
skip = ^Win32::Console::ANSI$
[Prereqs]
@@ -42,7 +44,9 @@ Carp::Always = 0
Class::Refresh = 0.05
Data::Dump = 0
Data::Printer = 0
+IO::Pager = 0
Proc::InvokeEditor = 0
+Term::ReadKey = 0
Term::ReadLine::Gnu = 0
; XXX it'd be nice if we could make this recommended instead of required
diff --git a/lib/Reply/Plugin/Pager.pm b/lib/Reply/Plugin/Pager.pm
new file mode 100644
index 0000000..9ef141a
--- /dev/null
+++ b/lib/Reply/Plugin/Pager.pm
@@ -0,0 +1,62 @@
+package Reply::Plugin::Pager;
+use strict;
+use warnings;
+# ABSTRACT: command to automatically open long results in a pager
+
+use base 'Reply::Plugin';
+
+use Term::ReadKey;
+
+=head1 SYNOPSIS
+
+ ; .replyrc
+ [Pager]
+ pager = less
+
+=head1 DESCRIPTION
+
+This plugin notices when too much output is going to be displayed as the result
+of an expression, and automatically loads the result into a pager instead.
+
+The C<pager> option can be specified to provide a different pager to use,
+otherwise it will use the value of C<$ENV{PAGER}>.
+
+=cut
+
+sub new {
+ my $class = shift;
+ my %opts = @_;
+
+ if (defined $opts{pager}) {
+ $ENV{PAGER} = $opts{pager};
+ }
+
+ # delay this because it checks $ENV{PAGER} at load time
+ require IO::Pager;
+
+ my $self = $class->SUPER::new(@_);
+ return $self;
+}
+
+sub print_result {
+ my $self = shift;
+ my ($next, @result) = @_;
+
+ my ($cols, $rows) = GetTerminalSize;
+
+ my @lines = map { split /\n/ } @result;
+ if (@lines >= $rows - 2) {
+ IO::Pager::open(my $fh) or die "Couldn't run pager: $!";
+ $fh->print(@result, "\n");
+ }
+ else {
+ $next->(@result);
+ }
+}
+
+=for Pod::Coverage
+ print_result
+
+=cut
+
+1;