more less mods, fixes
Dan Ts'o
dan at rna.UUCP
Wed Aug 28 05:21:23 AEST 1985
x
Here are a few more fixes to the LESS pager posted several weeks ago.
- A bug in the -s option, reported by unm-la!jay, is fixed.
- Shell escapes get the terminal as standard input.
- Hitting EOF twice on short files didn't exit, it now does.
- ^L, ^R, synonyms for r, repaint screen.
Cheers,
Dan Ts'o
Dept. Neurobiology
Rockefeller Univ.
1230 York Ave.
NY, NY 10021
212-570-7671
...cmcl2!rna!dan
rna!dan at cmcl2.arpa
*** prim.c.old Tue Aug 27 14:20:44 1985
--- prim.c Tue Aug 27 14:21:21 1985
***************
*** 37,44
* End of file: stop here unless the top line
* is still empty, or "force" is true.
*/
- if (!force && position(TOP) != NULL_POSITION)
- {
#ifdef EOFQUIT
eofquit++;
#endif
--- 37,42 -----
* End of file: stop here unless the top line
* is still empty, or "force" is true.
*/
#ifdef EOFQUIT
eofquit++;
#endif
***************
*** 40,46
if (!force && position(TOP) != NULL_POSITION)
{
#ifdef EOFQUIT
! eofquit++;
#endif
if (quiet == NOT_QUIET)
bell();
--- 38,44 -----
* is still empty, or "force" is true.
*/
#ifdef EOFQUIT
! eofquit++;
#endif
if (!force && position(TOP) != NULL_POSITION)
{
***************
*** 42,47
#ifdef EOFQUIT
eofquit++;
#endif
if (quiet == NOT_QUIET)
bell();
else
--- 40,47 -----
#ifdef EOFQUIT
eofquit++;
#endif
+ if (!force && position(TOP) != NULL_POSITION)
+ {
if (quiet == NOT_QUIET)
bell();
else
*** help.c.org Mon Jul 22 14:19:20 1985
--- help.c Tue Aug 27 14:23:55 1985
***************
*** 11,19
puts("b Backward one screen.\n");
puts("e, j, CR * Forward N lines, default 1.\n");
puts("y, k * Backward N lines, default 1.\n");
puts("d, ^D * Forward N lines, default 10 or last N to d or u command.\n");
puts("u, ^U * Backward N lines, default 10 or last N to d or u command.\n");
! puts("r Repaint screen.\n");
puts("g * Go to line N, default 1.\n");
puts("G * Like g, but default is last line in file.\n");
puts("= Print current file name\n");
--- 15,23 -----
puts("e, j, CR * Forward N lines, default 1.\n");
#endif
puts("y, k * Backward N lines, default 1.\n");
puts("d, ^D * Forward N lines, default 10 or last N to d or u command.\n");
puts("u, ^U * Backward N lines, default 10 or last N to d or u command.\n");
! puts("r, ^L, ^R Repaint screen.\n");
puts("g * Go to line N, default 1.\n");
puts("G * Like g, but default is last line in file.\n");
puts("= Print current file name\n");
*** ch.c.old Fri Aug 23 01:30:50 1985
--- ch.c Fri Aug 23 01:26:37 1985
***************
*** 84,90
*/
bp = buf_tail;
bp->block = ch_block;
! if (pipe)
{
/*
* The block requested should be one more than
--- 84,90 -----
*/
bp = buf_tail;
bp->block = ch_block;
! if (pipe || sflag)
{
/*
* The block requested should be one more than
***************
*** 221,227
public POSITION
ch_length()
{
! if (pipe)
return (NULL_POSITION);
return ((POSITION)(lseek(file, (off_t)0, 2)));
}
--- 221,227 -----
public POSITION
ch_length()
{
! if (pipe || sflag)
return (NULL_POSITION);
return ((POSITION)(lseek(file, (off_t)0, 2)));
}
*** command.c.old Sun Aug 25 21:56:52 1985
--- command.c Sun Aug 25 22:21:01 1985
***************
*** 3,8
*/
#include "less.h"
extern int erase_char, kill_char;
extern int pr_type;
--- 3,9 -----
*/
#include "less.h"
+ #include <signal.h>
extern int erase_char, kill_char;
extern int pr_type;
***************
*** 270,276
putc('\n');
flush();
raw_mode(0);
! system(cmdbuf);
raw_mode(1);
error("!done");
first_cmd = "r"; /* Repaint */
--- 271,277 -----
putc('\n');
flush();
raw_mode(0);
! shell(cmdbuf);
raw_mode(1);
error("!done");
first_cmd = "r"; /* Repaint */
***************
*** 601,604
}
}
}
}
--- 602,641 -----
}
}
}
+ }
+
+ shell(s)
+ char *s;
+ {
+ int status, pid, w;
+ register int (*istat)(), (*qstat)();
+ register char *sh;
+ extern int tty;
+
+ #ifdef VFORK
+ if ((pid = vfork()) == 0) {
+ #else
+ if ((pid = fork()) == 0) {
+ #endif
+ signal(SIGINT, SIG_DFL);
+ signal(SIGQUIT, SIG_DFL);
+ /* special less code */
+ close(0);
+ dup(tty);
+ for (pid = 3; pid < 30; close(pid++));
+ sh = getenv("SHELL");
+ if (sh && *sh)
+ execl(sh, "sh", "-c", s, 0);
+ execl("/bin/sh", "sh", "-c", s, 0);
+ _exit(127);
+ }
+ istat = signal(SIGINT, SIG_IGN);
+ qstat = signal(SIGQUIT, SIG_IGN);
+ while ((w = wait(&status)) != pid && w != -1)
+ ;
+ if (w == -1)
+ status = -1;
+ signal(SIGINT, istat);
+ signal(SIGQUIT, qstat);
+ return(status);
}
*** command.c.old Tue Aug 27 14:55:13 1985
--- command.c Tue Aug 27 14:55:16 1985
***************
*** 308,314
} else {
#ifdef EOFQUIT
intrquit = 0;
! if (strchr(" fdj\006\026", c) == 0)
eofquit = 0;
else if (eofquit) {
eofquit = 0;
--- 308,314 -----
} else {
#ifdef EOFQUIT
intrquit = 0;
! if (strchr(" fdj\006\026\n\r\004", c) == 0)
eofquit = 0;
else if (eofquit) {
eofquit = 0;
*** less.l.old Mon Aug 26 18:05:07 1985
--- less.l Tue Aug 27 14:30:32 1985
***************
*** 79,84
.IP r
Repaint the screen.
.PP
.IP R
Repaint the screen, discarding any buffered input.
Useful if the file is changing while it is being viewed.
--- 79,87 -----
.IP r
Repaint the screen.
.PP
+ .IP "^L, ^R"
+ Same as r.
+ .PP
.IP R
Repaint the screen, discarding any buffered input.
Useful if the file is changing while it is being viewed.
More information about the Comp.sources.bugs
mailing list