diff options
author | Jesse Luehrs <doy@tozt.net> | 2016-08-16 04:15:53 -0400 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2016-08-16 04:16:35 -0400 |
commit | c19df11fccbd5abf7296e86ee7dc8c2f769d7c21 (patch) | |
tree | 41aabf16d609a35b01c3d4a94ea8c4f38d03f60f | |
parent | 96ed58c6de66c8495cb3982373fb82ab19508536 (diff) | |
download | reply-c19df11fccbd5abf7296e86ee7dc8c2f769d7c21.tar.gz reply-c19df11fccbd5abf7296e86ee7dc8c2f769d7c21.zip |
add plugin to page long results (#47)
-rw-r--r-- | Changes | 1 | ||||
-rw-r--r-- | dist.ini | 4 | ||||
-rw-r--r-- | lib/Reply/Plugin/Pager.pm | 62 |
3 files changed, 67 insertions, 0 deletions
@@ -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) @@ -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; |