diff --git a/p b/p new file mode 100755 index 0000000..6ce6fb3 --- /dev/null +++ b/p @@ -0,0 +1,47 @@ +#!/usr/bin/env perl + +use strict; +use warnings; + +my $pagesize = $ENV{'LINES'} || 22; + +open(my $tty, '<', '/dev/tty') + or die "$0: Cannot open /dev/tty for reading: $!"; + +sub evalcmd { + { + chomp($_ = <$tty>); + if (/^q$/) { + exit(0); + } elsif (/^!(.*)/) { + system($1); + redo; + } + } +} + +sub printfile { + my ($fh) = @_; + my $lines = 0; + while (<$fh>) { + print; + &evalcmd unless ++$lines % $pagesize; + } + &evalcmd; +} + +unshift(@ARGV, '-') unless @ARGV; + +for (@ARGV) { + if (/^-$/) { + &printfile(\*STDIN); + } elsif (/^-(\d+)$/) { + $pagesize = $1; + } else { + open(my $fh, '<', $_) or die "$0: Cannot open $_ for reading: $!"; + &printfile($fh); + close($fh); + } +} + +close($tty); diff --git a/p.1 b/p.1 new file mode 100644 index 0000000..6abb531 --- /dev/null +++ b/p.1 @@ -0,0 +1,48 @@ +.Dd May 17, 2024 +.Dt TS 1 +.Os +.Sh NAME +.Nm p +.Nd Paginate +.Sh SYNOPSIS +.Nm +.Op Fl number +.Ar +.Sh DESCRIPTION +.Nm +copies its standard input, or the named files if given, +to its standard output, +stopping at the end of every page and at the end of each file. +The special file name +.Pa - +can be used to refer explicitly to the standard input. +.Pp +Page size is defined by the +.Ev LINES +environment variable. +If not defined, a default page size of 22 will be used. +The page size can be overriden with the numeric option. +.Pp +While waiting for a newline, +.Nm +interprets the commands: +.Bl -tag +.It ! +Run the rest of the line as a shell command. +.It q +Quit. +.El +Any other input will show the next input page. +.Sh ENVIRONMENT +.Bl -tag -width LINES +.It Ev LINES +Number of lines of the terminal. +.El +.Sh EXIT STATUS +.Ex -std +.Sh HISTORY +This is a reimplementation of Plan 9's +.Nm +pager. +.Sh AUTHORS +.An Adolfo Perez Alvarez Aq Mt adolfopa@sdf.org