From c19df11fccbd5abf7296e86ee7dc8c2f769d7c21 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Tue, 16 Aug 2016 04:15:53 -0400 Subject: add plugin to page long results (#47) --- Changes | 1 + dist.ini | 4 +++ lib/Reply/Plugin/Pager.pm | 62 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+) create mode 100644 lib/Reply/Plugin/Pager.pm 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 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; -- cgit v1.2.3